CCC-Fahrplan aktualisiert
Mein im letzten Jahr gestarteter CCC-Fahrplan wurde aktualisiert und enthält nun Informationen zum 34c3.
Die Daten werden regelmäßig aktualisiert; für verbindliche Angaben halte dich bitte an den offiziellen Fahrplan.
Die Daten werden regelmäßig aktualisiert; für verbindliche Angaben halte dich bitte an den offiziellen Fahrplan.
Quartal mit C# ermitteln
Leider bietet die
DateTime
-Struktur standardmäßig keine eingebaute Funktionalität zur Ermittlung des Quartals einer Instanz. Wir werden diese daher als praktische Erweiterungsmethode ergänzen:
Erweiterungsmethode implementieren
Durch die vorherige Addition von 0102030405
public static class DateTimeExtensions { public static int GetQuarter(this DateTime dateTime) { return ((dateTime.Month + 2) / 3); }}
2
wird die (ganzzahlige) Teilbarkeit bei richtigem Ergebnis sichergestellt. Indem die Teilung variabel gestaltet wird, beispielsweise mit Hilfe eines zu übergebenden Aufzählungswertes mit passenden ganzzahligen Werten, können auch andere Jahresteile (z. B. Halbjahre) sehr einfach ermittelt werden:
Erweiterungsmethode implementieren (erweitert)
Die Verwendung gestaltet sich in beiden Fällen naheliegend einfach:
010203040506070809101112
public static class DateTimeExtensions { public static int GetYearDivisionPart(this DateTime dateTime, YearDivision yearDivision) { int monthsPerDivision = (int) yearDivision;
return ((dateTime.Month + (monthsPerDivision – 1)) / monthsPerDivision); }
public enum YearDivision { Half = 6, Quarter = (Half / 2) }}
CSV- zu XML-Dateien konvertieren
Ein bestehendes Projekt von mir beinhaltet eine erweiterbare Dateiverwaltung. Die Anforderung war es nun, CSV-Dateien zu XML-Dateien zu konvertieren. Die Ausgangsdateien haben folgenden einheitlichen Aufbau:
CSV-Dateiformat (→ test.csv)
Zwar ist dieser konkrete Kontext sicherlich etwas speziell, jedoch möchte ich die allgemein verwendbare Kernfunktionalität kurz vorstellen. Ihr könnt euch im Folgenden also auf die Methode 010203
spalte1,spalte2,spalte3inhaltA,inhaltB,inhaltCinhaltD,inhaltE,inhaltF
ConvertFiles
konzentrieren:
Konvertierung implementieren
Ich habe die beispielhafte Implementierung bereits etwas vereinfacht und wie üblich um Fehlerbehandlungen etc. reduziert, um den Fokus auf die eigentliche Funktionalität zu legen. Die Verwendung gestaltet sich nun sehr einfach:
Die zu Beginn beschriebene Beispiel-Datei würde nun zu folgender Datei konvertiert:
010203040506070809101112131415161718192021222324252627282930313233
public static class CsvToXml { public static void ConvertDirectory(string path, SearchOption searchOption) { CsvToXml.ConvertFiles(Directory.EnumerateFiles(path, "*.csv", searchOption)); }
public static void ConvertFiles(params string[] pathList) { foreach(string path in pathList) { using(StreamReader fileStream = File.OpenText(path)) { string currentLine = fileStream.ReadLine(); string[] fieldList = currentLine.Split(',');
XElement root = new XElement("entries"); XDocument document = new XDocument(root);
while((currentLine = fileStream.ReadLine()) != null) { string[] dataList = currentLine.Split(',');
XElement entry = new XElement("entry"); root.Add(entry);
for(int i = 0; i < dataList.Length; i++) { entry.Add(new XElement(fieldList[i], dataList[i])); } }
document.Save(Path.Combine( Path.GetDirectoryName(path), String.Concat(Path.GetFileNameWithoutExtension(path), ".xml") )); } } }}
XML-Dateiformat (→ test.xml)
Natürlich kann diese grundlegende Funktionalität beliebig erweitert werden, beispielsweise für weitere Dateiendungen oder um die Bezeichner der äußeren Elemente (01020304050607080910111213
<?xml version="1.0" encoding="utf-8"?><entries> <entry> <spalte1>inhaltA</spalte1> <spalte2>inhaltB</spalte2> <spalte3>inhaltC</spalte3> </entry> <entry> <spalte1>inhaltD</spalte1> <spalte2>inhaltE</spalte2> <spalte3>inhaltF</spalte3> </entry></entries>
entries
und entry
) individuell angeben zu können. Je nach gewünschtem Einsatzzweck kann insbesondere auch die SearchOption
-Aufzählung interessant sein. Windows Defender mit C# ansprechen
Windows stellt unter der Bezeichnung Antimalware Scan Interface native Funktionalität zur Interaktion mit Windows Defender bereit. Wir werden für C# also – wieder einmal – auf
Die Überprüfung gestaltet sich nun jedoch grundsätzlich äußerst einfach durch Übergabe des fraglichen Inhalts:
Vor einem tatsächlichen Einsatz sollten mindestens noch Überprüfungen der Rückgabewerte (→
DllImport
setzen:
Wrapper implementieren
Die Verwendung der empfohlenen Funktion 01020304050607080910111213141516171819202122232425262728293031
public static class AmsiWrapper { public static Result Scan(string content, string name = null) { AmsiInitialize(nameof(AmsiWrapper), out IntPtr context); AmsiScanString(context, content, name, IntPtr.Zero, out Result result); AmsiUninitialize(context);
return result; }
public enum Result { Clean = 0, NotDetected = 1, Detected = 32768 }
[DllImport("Amsi")] private static extern int AmsiInitialize(string appName, out IntPtr amsiContext);
[DllImport("Amsi")] private static extern int AmsiScanString( IntPtr amsiContext, string @string, string contentName, IntPtr session, out Result result );
[DllImport("Amsi")] private static extern void AmsiUninitialize(IntPtr amsiContext);}
AmsiResultIsMalware
ist kurioserweise leider nicht möglich, da diese schlicht nicht in Amsi.dll
gefunden werden kann. Es gilt also die Hinweise von AMSI_RESULT
zu beachten.Die Überprüfung gestaltet sich nun jedoch grundsätzlich äußerst einfach durch Übergabe des fraglichen Inhalts:
Wrapper verwenden
Zum Test der Erkennung potentiell bedrohlicher Inhalte kann beispielsweise die EICAR-Testdatei dienen.0102030405
if(AmsiWrapper.Scan("sehrGefährlicherInhalt") == AmsiWrapper.Result.Detected) { /* Inhalt als Bedrohung erkannt */} else { /* Inhalt nicht als Bedrohung erkannt */}
Vor einem tatsächlichen Einsatz sollten mindestens noch Überprüfungen der Rückgabewerte (→
HRESULT
) mit entsprechender (Fehler-)Behandlung ergänzt werden. Laufwerke mit C# ermitteln
Eine häufig gefragte – und eigentlich auch gar nicht besonders versteckte – Funktionalität ist das Abrufen der verfügbaren Laufwerke und Informationen dazu. Daher im Folgenden gerne eine kleine Übersicht dazu:
Laufwerksinformationen abrufen
In diesem Zusammenhang sei außerdem nochmals auf meinen Beitrag Byte-Angaben mit C# formatieren verwiesen, um die rohen Byte-Angaben auf besser lesbare Größen zu bringen. In einem späteren Beitrag möchte ich gerne noch aufzeigen, wie sich programmatisch Laufwerke erzeugen und weitergehend verwenden lassen. 010203040506070809101112131415161718192021222324
foreach(DriveInfo driveInfo in DriveInfo.GetDrives()) { /** * driveInfo.AvailableFreeSpace * -> Verfügbarer Speicherplatz (mit Berücksichtigung des Benutzers) * * driveInfo.DriveFormat * -> Dateisystem (z. B. NTFS) * * driveInfo.DriveType * -> Laufwerkstyp (z. B. Network oder Fixed für lokale Festplatten) * * driveInfo.Name * -> Laufwerksbuchstabe (z. B. "C:\") * * driveInfo.TotalFreeSpace * -> Verfügbarer Speicherplatz (ohne Berücksichtigung des Benutzers) * * driveInfo.TotalSize * -> Gesamtspeicherplatz * * driveInfo.VolumeLabel * -> Beschriftung (z. B. "System") */}
Project links
-
BitStadt – Stadtportal
Berlin · Hamburg · Amsterdam -
CCC – Fahrplan
Schedules for the CCCongress
Categories / Archive | Übersicht
- PHP functions in C# (136)
- Dictionary (257)
Tags
.NET · ADO.NET · Work · ASP.NET MVC · Blog · C# · Generics · Society · Computer Science · Java · LINQ · Logic · Mathematics · Network · PHP · Project · Security · Software development · Studies · Technics · Theory · Web design · WPF