Laden...

Windows-Login vor eigenes Programm schalten

Erstellt von Teilzeitstudent vor 18 Jahren Letzter Beitrag vor 18 Jahren 3.389 Views
T
Teilzeitstudent Themenstarter:in
26 Beiträge seit 2005
vor 18 Jahren
Windows-Login vor eigenes Programm schalten

Hintergrund: Es gibt im Büro Computer, auf denen mehrer Leute zugriff haben. Diese Computer sind z.B. unter den Windows-Konten Computer1 usw angemeldet.

Auf mein Programm sollen sich die Benutzer mit ihrem eigenen Windows-Login anmelden, da nicht jeder berechtigt ist, dass Programm zu benutzen. Kann ich den Windows-Login benutzen bzw wie lese ich Benutzernamen und Passwort ein, falls ich ein eigenes Form basteln muss.

Hab da bis jetzt nur was über Webanwendungen gefunden. Vielen dank schon mal für eure hilfe

Idiotensichere Programme gibt es nicht!
Die Idioten sind einfach zu einfallsreich.

Schokolade ist gut gegen Zähne!

1.549 Beiträge seit 2004
vor 18 Jahren

An den Benutzer Namen kommst du das Kennwort kannst du nicht von Win bekommen aber mit 2 Text boxen kannst du dir ja einen eigenen Dialog Machen in dem man einen Benutzernamen und Kennwort setzen kann das Speicherst du dann in einer Datei

Wir Arbeiten eigendlich nicht wir nehmen nur das geld

S
125 Beiträge seit 2005
vor 18 Jahren

Es könnte über WMI gehen, zum mindest das auslesen der Benutzerdaten.

Schau mal hier nach "Win32_LogonSession" oder evtl. "Win32_User" oder so.

Hier im Forum sind noch Links für www.CodeProject.com. Dort findest du einige Tutorials zu WMI.

Benutze erstmal die Suche.

Wenn noch Fragen sind, posten... 😁

Mfg SGT_BOB

*************************
Ich bin root, ich darf das... 😜
root>_
*************************

1.549 Beiträge seit 2004
vor 18 Jahren

Das Kenwort wird man über WMI ziemlich sicher auch nicht bekommen schon alleine aus sicherheits- gründen(wenn dann bekommt man nur einen Hash und der stet in der Registry weiß leider nur wo der vom IE steht)

Wir Arbeiten eigendlich nicht wir nehmen nur das geld

4.506 Beiträge seit 2004
vor 18 Jahren

Hallo Teilzeitstudent!

Schau Dir unbedingt mal die Klasse System.Environment an, die bietet von Haus aus nämlich Optionen um herauszufinden welcher Benutzer Deine Applikation gestartet hat, welche OS-Version etc...

Es sind alles Static Methoden und Properties, so dass die Eigenschaften ohne Instanz ausgelesen werden können.

Z.B. so:



string currUser = System.Environment.UserName;


Ciao
Norman-Timo

[EDIT] Dann brauchst Du keinen erneuten Login, und auch keine Passwortabfrage! [/EDIT]

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

T
Teilzeitstudent Themenstarter:in
26 Beiträge seit 2005
vor 18 Jahren

Naja, ich weiß ja, welcher Benutzer die Application gestartet hat. Das ist ja dann der Benutzer 'Computer 1' oder so. Das bringt mich nicht viel weiter.
Kann ich nicht, wie das z.B. bei ASP.NET Webanwendungen möglich ist einen Windowslogin aufrufen, der dann den Benutzer nach Bernutzernamen und Kennwort frägt und mir dann den Benutzer liefert?

Idiotensichere Programme gibt es nicht!
Die Idioten sind einfach zu einfallsreich.

Schokolade ist gut gegen Zähne!

S
230 Beiträge seit 2004
vor 18 Jahren

Wenn du doch weisst, welcher Benutzer im Windows eingeloggt ist (und das Windows Logon schon hinter sich hat), dann weisst du ja auch welcher Benutzer auf deine Applikation zugreift. Oder willst du, dass sich theoretisch auf dem Computer von Hans Muster im Benutzer von Hans Muster jemand anderes für dein Program anmelden kann?

Wenn Zeit in Geschichte übergeht und keine Blüten trägt werden Zukunftsbilder blass //Clueso

T
Teilzeitstudent Themenstarter:in
26 Beiträge seit 2005
vor 18 Jahren

Ja genau das will ich. Der Computer ist ein allgemeiner Arbeitsplatz, an dem mehrere Leute arbeiten. Für mein Programm ist aber nicht jeder Benutzer berechtigt. Ich muss den Benutzer also identifizieren und das anhand seines Windows-Logins. Er soll aber nicht den Benutzer 'Computer1' abmelden und sich dann unter seinem Namen anmelden sondern vor mein Programm soll eine Abfrage stattfinden, welcher Benutzer er denn sei. Dazu muss er natürlich auch sein Passwort eingeben, sonst könnt ja jeder beliebige unter seinem Namen im Programm arbeiten.

Idiotensichere Programme gibt es nicht!
Die Idioten sind einfach zu einfallsreich.

Schokolade ist gut gegen Zähne!

1.271 Beiträge seit 2005
vor 18 Jahren

Du könntest wirklich, wie S.H.-Teichof schon gesagt hat, einen eigenen login machen. Man kann Benutzerkonten erstellen, ein Administrator kann Rechte vergeben und die Benutzernamen und passwörter werden verschlüsselt in eine Datei schreiben. Damit wärst du flexibler als mit dem Windows-Login.

A wise man can learn more from a foolish question than a fool can learn from a wise answer!
Bruce Lee

Populanten von Domizilen mit fragiler, transparenter Außenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
Wer im Glashaus sitzt, sollte nicht mit Steinen werfen.

T
Teilzeitstudent Themenstarter:in
26 Beiträge seit 2005
vor 18 Jahren

nein, so kann ich das leider nicht machen. die benutzer mit den berechtigungen sind ja in der datenbank des programms schon angelegt. es wird der windows-loginname abgefragt und mit den usern aus der datenbanken verglichen. gibt es den user noch nicht, wird er neu angelegt und die berechtigung auf disabled gesetzt. ein admin kann dann seine berechtigung ändern. jetzt soll eine neue benutzergruppe (neben normal, disabled und admin) eingeführt werden, der halt dann 'computer' oder so heisst. alle allgemeinen logins haben diese berechtigung. startet jetzt einer von so einem allgemeinen computer das programm, erkennt das programm die berechtigung 'computer' und startet den windows-login. so soll das gemacht werden 😉

Idiotensichere Programme gibt es nicht!
Die Idioten sind einfach zu einfallsreich.

Schokolade ist gut gegen Zähne!

4.506 Beiträge seit 2004
vor 18 Jahren

Hallo Teilzeitstudent!

So ganz hab ich das nicht verstanden.

Also nochmal die Frage: Wieso ergibt die Abfrage nach dem Username 'Computer1' ?

Muss sich beim Windows nicht jeder Benutzer mit einem individuellen Namen einloggen?

Wie werden Benutzerinformationen von Windows aus auf der Datenbank gehalten? Das geht meines Erachtens gar nicht (vielleicht in einer Domäne?).

Bist Du Administrator auf dem betreffenden PC? -> Wenn ja, dann kannst Du doch Deine Applikation unter den Gruppenrichtlinien eintragen, und nur den bestimmten Benutzern zur Verfügung stellen.

Bitte erkläre mir das mal...

Ciao
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

T
Teilzeitstudent Themenstarter:in
26 Beiträge seit 2005
vor 18 Jahren

Naja, ich wollt ja eigentlich nur erklären, warum ich keinen eigenen Login machen kann sondern den Windows-Login benutzen will (muss). Es ist nicht wichtig, dass zu verstehen. Es ist nur wichtig zu wissen, dass ich keinen eigenen Login mit eigenen Benutzernamen und Kennwörter machen kann.

Das mit den Benutzerrichtlinien funktioniert nicht, weil die Benutzer nicht unter ihrem eigenen Benutzernamen sondern unter einem allgemeinen Benutzernamen angemeldet sind

Idiotensichere Programme gibt es nicht!
Die Idioten sind einfach zu einfallsreich.

Schokolade ist gut gegen Zähne!

4.506 Beiträge seit 2004
vor 18 Jahren

Hallo Teilzeitstudent!

Ich persönlich rede ja nicht von einem eigenen Login!

Aber die Frage:

Wieso ergibt die Abfrage nach dem Username 'Computer1' ?

ist hier doch nicht unwichtig. Also wie muss man sich an dem PC anmelden, um ihn benutzen zu können? Ich rede hier von der Windows-Anmeldung nach dem Hochfahren des Rechners!

Ciao
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

T
Teilzeitstudent Themenstarter:in
26 Beiträge seit 2005
vor 18 Jahren

Diese Computer sind Computer, die für viele zugänglich sind. Man muss sich nicht unter eigenem Login anmelden sondern der Computer ist als 'Computer 1' angemeldet, da ihn mehrere Personen benutzen. Startet nun eine der Personen mein Programm, soll das folgendermaßen ablaufen.

-> Überprüfuen des Benutzernamens
-> Benutzername = Computer 1
-> Vergleich mit in der Datenbank gespeicherten Benutzer
-> Computer 1 vorhanden -> Berechtigung = 'allgemeiner Arbeitsplatz'
-> Login starten um benutzer zu identifizieren.
-> Login liefert mustermann_h
-> Vergleich mit in der Datenbank gespeicherten Benutzer
-> musermann_h gefunden -> Berechtigung = ' normaler Benutzer'
-> starte Programm
-> ...

Idiotensichere Programme gibt es nicht!
Die Idioten sind einfach zu einfallsreich.

Schokolade ist gut gegen Zähne!

4.506 Beiträge seit 2004
vor 18 Jahren

Hallo TZS!

Jetzt hab ichs vollständig verstanden.

Das mit dem Windows-Login wird nicht funktionieren, weil der Computer immer seine lokal vorhandenen und eingetragenen Benutzer heranzieht. Du möchtest Benutzer mit einer individuellen Datenbank vergleichen, das kann das Windows-Login nicht.

Leider ist der Dialog nicht so aufgebaut, dass er "nur" eingegebenen Username und Passwort zurückliefert und man selbst nachschauen muss, ob Berechtigungen vorliegen.

Es ist so, dass der Dialog das gleich mitmacht auch aus Sicherheitsgründen, und deshalb bleibt Dir nur die Möglichkeit ein eigenes Login zu programmieren.

Oder der Benutzer muss sich auch auf dem allgemeinen PC unter seinem richtigen Usernamen anmelden, also abmelden und neu anmelden, danach wieder abmelden und allgemein anmelden...

Tut mir leid, dass ich Dir da nix anderes sagen kann.

Ciao
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

C
980 Beiträge seit 2003
vor 18 Jahren

Falls ich deinen Ausführungen richtig gefolgt bin: Der offizielle Weg für sowas heisst Impersonation. D.h. du bist mit einem NT User "Computer 1" angemeldet, möchtest ein Programm aber im Kontext eines anderen NT Users "Hans Müller" ausführen, der dabei aber korrekt von Windows authentifiziert wird. Manuell geht das über Kontextmenü>"Ausführen Als..." (geht aber auch programmatisch). Die Rechte kannst dann wie oben erwähnt mit GPs oder ACLs auf Systemebene konfigurieren, oder auch manuell .NET intern mit den .NET-eigenen Hilfsmitteln ... ist es das was du suchst?

T
Teilzeitstudent Themenstarter:in
26 Beiträge seit 2005
vor 18 Jahren

Ja, genau das ist das, was ich suche! 😉
Um die Rechte braucht sich das System nicht zu kümmern

Idiotensichere Programme gibt es nicht!
Die Idioten sind einfach zu einfallsreich.

Schokolade ist gut gegen Zähne!

4.506 Beiträge seit 2004
vor 18 Jahren

Hallo cdr!

Was bedeutet nun

GPs oder ACLs auf Systemebene ?

Ich liebe ja Abkürzungen über alles 😉

Ciao
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

C
980 Beiträge seit 2003
vor 18 Jahren

GP = Group Policy
ACL = Access Control List (=NTFS Berechtigungen)

Ist hier aber offenbar beides hinfällig weil die Rechte ja nicht vom OS sondern von der App selber vewaltet werden sollen ...

btw, bzgl. Impersonation in C#:

http://www.codeproject.com/csharp/ZetaImpersonator.asp
http://www.codeproject.com/csharp/cpimpersonation1.asp
http://blogs.ssw.com.au/andrewweaver/articles/186.aspx

4.506 Beiträge seit 2004
vor 18 Jahren

Danke cdr, die Abkürzungen waren mir jetzt nicht gelaüfig, was sie bedeuten schon, aber vielen Dank!

@Teilzeitstudent:

So wie gerade eben aber cdr schon gesagt hat:

Ist hier aber offenbar beides hinfällig weil die Rechte ja nicht vom OS sondern von der App selber vewaltet werden sollen

Und so wie ich schon vorher ebenfalls erwähnt habe:

Das mit dem Windows-Login wird nicht funktionieren, weil der Computer immer seine lokal vorhandenen und eingetragenen Benutzer heranzieht.

Deshalb wird es bei Dir nicht funktionieren. Das Win-Login benutzt die Lokal vorhandenen Benutzer, die in dem Windows eingetragen sind, und cdr und ich vermuten, dass Deine Benutzer auf dem allgemein zugänglichen PC nicht eingetragen sind. (Ausnahme Domäne, da wird auf andere Ebene Benutzer abgefragt).

Ciao
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

T
Teilzeitstudent Themenstarter:in
26 Beiträge seit 2005
vor 18 Jahren

Ja, es handelt sich bei dem ganzen um eine Domäne. Hab jetzt auch schon was gefunden, wie das ganze funktioniert (dank des wortes impersonitation).
Hab mir jetzt einen eigenen Login gebaut und benutz dann folgendes, um den benutzer zu wechseln:



[DllImport("advapi32.dll", SetLastError=true)]
public static extern bool LogonUser(String lpszUsername, String lpszDomain,
                                                   String lpszPassword, int dwLogonType, int                    
                                                    dwLogonProvider, ref IntPtr phToken);

[DllImport("kernel32.dll", CharSet=CharSet.Auto)]
public extern static bool CloseHandle(IntPtr handle);

[DllImport("advapi32.dll", CharSet=CharSet.Auto, SetLastError=true)]
public extern static bool DuplicateToken(IntPtr ExistingTokenHandle, 
			                                  int SECURITY_IMPERSONATION_LEVEL, ref 
                                                          IntPtr DuplicateTokenHandle);


[PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")]
private void ChangeUser(string loginName, string password)
{
	IntPtr tokenHandle = new IntPtr(0);
	IntPtr dupeTokenHandle = new IntPtr(0);


	string domainName = System.Environment.UserDomainName
           
	const int LOGON32_PROVIDER_DEFAULT = 0;


	const int LOGON32_LOGON_INTERACTIVE = 2;
	const int SecurityImpersonation = 2;

	tokenHandle = IntPtr.Zero;
	dupeTokenHandle = IntPtr.Zero;

	bool returnValue = LogonUser(loginName, domainName, password, 
				LOGON32_LOGON_INTERACTIVE, 
                                LOGON32_PROVIDER_DEFAULT,
				ref tokenHandle);
                    
	if (false == returnValue)
	{
		int ret = Marshal.GetLastWin32Error();
		return;
	}

	bool retVal = DuplicateToken(tokenHandle, SecurityImpersonation, ref 
                                           dupeTokenHandle);

	if (false == retVal)
	{
		CloseHandle(tokenHandle);    
		return;
	}

	WindowsIdentity newId = new WindowsIdentity(dupeTokenHandle);
	WindowsImpersonationContext impersonatedUser = newId.Impersonate();
	
	if (tokenHandle != IntPtr.Zero)
		CloseHandle(tokenHandle);
	if (dupeTokenHandle != IntPtr.Zero) 
		CloseHandle(dupeTokenHandle);
}
	

danke cdr für den tipp mit dem impersonitation. allen anderen danke ich natürlich auch. wäre jetzt noch sehr hilfreich wenn irgendjemand verbesserungsvorschläge für den code hat oder weiß, ob das bei anderen betriebssystemen (ausser XP) auch funktioniert.

Idiotensichere Programme gibt es nicht!
Die Idioten sind einfach zu einfallsreich.

Schokolade ist gut gegen Zähne!

C
980 Beiträge seit 2003
vor 18 Jahren

Ich mag mich ganz schwach daran erinnern, dass bzgl. Impersonation (heisst übrigens auch auf deutsch so, ohne "it" - oder aber gleich "Personifikation" 😉 ) sich bei XP etwas geändert bzw. vereinfach hat gegenüber W2k, ich würde es also sicherheitshalber zumindest mal ausprobieren falls möglich ...