HowTo: C# Programm nur mit NotifyIcon ohne Form starten

Für den Fall, dass ihr eine Anwendung erstellen wollt, welche (zum Start) nur ein NotifyIcon (also ein Symbol in der Taskleiste besitzt), müsst ihr den Standardprogrammaufruf etwas abändern.
Der standardmäßig erstellte Code von VisualStudio startet automatisch eine Form. Diese könnte man nun ausblenden (WindowState = Minimized, ShowInTaskBar = false) aber es geht auch eleganter. Erstellt einfach ein NotifyIcon mit Icon und Visible = true und ruft Application.Run() ohne Parameter auf.

		/// <summary>
		/// 	Der Haupteinstiegspunkt für die Anwendung.
		/// </summary>
		[STAThread]
		private static void Main()
		{
			Application.EnableVisualStyles();
			Application.SetCompatibleTextRenderingDefault(false);

			_trayIcon = new NotifyIcon {Icon = Icon.FromHandle(new Bitmap("Gear.png").GetHicon()), Visible = true};
			_trayIcon.Click += TrayIconClick;

			Application.Run();
			_trayIcon.Dispose();
		}

Im Anhang findet ihr eine Beispielsolution. Wichtig ist, dass ihr euch selbst ums Dispose() kümmern müsst, damit etwa das NotifyIcon aus der Taskleiste verschwindet, sobald die Applikation beendet wird. Das Beispiel öffnet beim Klick auf das NotifyIcon eine leere Form. Wird diese geschlossen, wird das ganze Programm beendet.

Download: Beispiel Solution – Start App With Notify Icon

HowTo: TrueCrypt-Container per Commandline mounten

Auf meinem neuen NAS habe ich mir TrueCrypt Container-Dateien angelegt, um Daten verschlüsselt speichern zu können. Nun möchte ich die Laufwerke schnell einbinden können, ohne jedes mal umständlich TrueCrypt starten zu müssen etc.

Dazu kann man sich eine Mount.bat mit folgendem Inhalt erstellen:

@echo off
echo Füge TC-Laufwerk hinzu..
"C:\Program Files\TrueCrypt\TrueCrypt.exe" /l Z /v OrdnerName/TCContainer.tc /a /q

Damit werden automatisch alle möglichen Werte vorbelegt und man muss nur noch sein Passwort eingeben. Wer selbst dazu zu faul ist, kann noch den Parameter „/p“ verwenden. Die Containerdatei wird hier als Laufwerk Z: gemountet.
Um das Laufwerk wieder zu entfernen, könnt ihr euch eine Dismount.bat erstellen:

@echo off
echo Entferne TC-Laufwerk!
"C:\Program Files\TrueCrypt\TrueCrypt.exe" /d Z /q

Bei dem Beispiel wird nur Laufwerk Z: entfernt. Nutzt ihr dagegen Parameter „/d“ ohne weitere Zusätze, werden alle TrueCrypt Laufwerke entfernt. Der Parameter „/q“ sagt in beiden Fällen übrigens aus, dass TrueCrypt nicht als Anwendung im Systray liegt. Denn dann wartet das CMD-Fenster, bis TrueCrypt wieder geschlossen wird.

Eine komplette Übersicht über alle Parameter findet ihr hier.

Ach ja, man kann dies natürlich auch mit der portablen Version von TrueCrypt verwenden, hier schlägt jedoch jedes mal das UAC von Windows an (wegen dem Laufwerk hinzufügen). Muss man halt sehen, wie der Bedarfsfall ist.

C#4.0 – Problematik bei Default Values

Golo Roden erwähnte es bereits in den Kommentaren, daher möchte ich noch mal genauer darauf eingehen.
Dazu erstelle ich eine Solution in Visual Studio 2010 mit einer Konsolenapplikation, welche ich „DefaultValues“ nenne. C#4.0 – Problematik bei Default Values weiterlesen

Boolschen Rückgabewert einer Stored Procedures in C#

Ich hatte mir eine Stored Procedure erstellt, welche überprüft, ob es schon einen bestimmten Eintrag in der Datenbank gibt. Sie sollte mir also nur ein true oder false zurück liefern.

ALTER PROCEDURE dbo.LineExists	
	(
	@name nvarchar(100)	
	)	
AS BEGIN
	IF(EXISTS(Select [Name] FROM DemoTable WHERE [Name] = @name))
		RETURN(1)
	ELSE
		RETURN(0)
END

Meine passende C# Funktion sah in etwa so aus:

SqlConnection sqlConn = new SqlConnection(this.connstring);
SqlCommand sqlCom = new SqlCommand("LineExists", sqlConn);
sqlCom.CommandType = CommandType.StoredProcedure;
sqlCom.Parameters.Add("@name", SqlDbType.NVarChar).Value = "TestLeine";

sqlConn.Open();
bool vorhanden = ((int)sqlCom.ExecuteScalar() == 1) ? true:false;

Das führte immer zu einer Null-Reference-Exception. Auch der Weg über einen SqlDataReader funktionierte nicht. Eine Möglichkeit wäre, die Stored Procedure anzupassen und statt „Return(0)“ „Select 0“ zurück zu geben. Dann würde der obere Code auf jeden Fall funktionieren.

Andere Möglichkeit wäre, den Return Value auszulesen. Dazu muss man dem SqlCommand einen Parameter mitgeben, welchen ihr nach der SQL Operation wieder auslest. Kurzes Code-Beispiel:

SqlConnection sqlConn = new SqlConnection(this.connstring);
SqlCommand sqlCom = new SqlCommand("LineExists", sqlConn);
sqlCom.CommandType = CommandType.StoredProcedure;
sqlCom.Parameters.Add("@name", SqlDbType.NVarChar).Value = "TestLeine";
sqlCom.Parameters.Add("RETURN_VALUE", SqlDbType.Int).Direction = ParameterDirection.ReturnValue;

sqlConn.Open();
sqlCom.ExecuteNonQuery();
bool vorhanden = ((int)sqlCom.Parameters["RETURN_VALUE"].Value == 1) ? true:false;

Beide liefern das selbe Ergebnis. Pro oder Contra habe ich bei einer spontanen Google-Recherche nicht gefunden, ist sicherlich Geschmackssache.

C#: Hashes versalzen

Kleine Vorgeschichte
Heute habe ich mir die Möglichkeit angeschaut, eigene MembershipProvider für ein ASP.NET MVC Projekt zu schreiben. Selbstverständlich wollte ich die Passwörter in der Datenbank nur als Hash speichern. Gleich ist mir wieder ein altes Problem aufgefallen, welches mir auch damals bei PHP aufgefallen ist. Vorteil der Hashmethode ist die fehlende Möglichkeit, wieder in Klartext umgewandelt zu werden. Allerdings ist der Hash immer gleich.
So wird aus

md5(„test“) immer „098f6bcd4621d373cade4e832627b4f6“

Das Problem
Selbst wenn nun ein böser Hacker die Datenbank ausliest, kommt er so an das Passwort. Der einfachste Weg liegt dabei so nahe, dass man gar nicht drauf kommt. Gebt mal so einen Hash bei Google ein, man wird das Passwort herausfinden können. Und mittlerweile gibt es ganze Rainbow-Tabellen, so dass es immer einfacher wird, die Werte zu vergleichen.
Aufgrund des Einfallsreichtums mancher Menschen tippe ich mal darauf, dass man ca. 50% der Passwörter der Otto-Normal-Benutzer daher innerhalb weniger Minuten knacken könnte.
C#: Hashes versalzen weiterlesen