2011-01-13 8 views
7

Ich habe eine Situation, wo ich den folgenden Code verwenden Benutzermitgliedschaft in AD zu überprüfen, bevor Aufgaben in meinem appWinform Benutzerberechtigung über Active Directory

using System.Security.Principal; 
WindowsIdentity identity = WindowsIdentity.GetCurrent(); 
WindowsPrincipal principal = new WindowsPrincipal(identity); 
return principal.IsInRole("someGroup"); 

Der obige Code funktioniert gut für Maschinen, die auf meiner Domain ausgeführt wird, Allerdings habe ich einige Maschinen, die nicht auf meiner Domain sind, auf der ich die WINFORM-Anwendung installiert habe. Wie kann ich die Benutzermitgliedschaft in AD überprüfen?

Edit - gibt es eine Möglichkeit, die Windows-Anmeldung zu veranlassen?

+0

Meinen Sie, dass der Benutzer (und Ihr Computer), der Ihre Winform-Anwendung ausführt, sich in einer anderen nicht vertrauenswürdigen Domäne oder überhaupt nicht in einer Domäne befindet? Was meinst du mit dem Windows Login? Sie können tatsächlich ein eigenes Dialogfeld erstellen, um den Benutzer aufzufordern, seinen Domänenbenutzer und sein Kennwort einzugeben. Anschließend verwenden Sie seine Domänenanmeldeinformationen, um mit dem Active Directory zu kommunizieren. –

+0

Korrekt. Einige Maschinen sind nicht in der Domäne. Wo finde ich Informationen zur Weitergabe von Anmeldeinformationen über eine benutzerdefinierte Anmeldebox? Ich habe versucht, ich bin in der Lage zu authentifizieren, aber keine Mitgliedschaftsinformationen zu erhalten. Ich folgte diesem http://support.microsoft.com/kb/326340 –

+1

Irgendein Kommentar zu meiner vorgeschlagenen Antwort? Funktioniert es für Sie? –

Antwort

7

Da Ihr Computer nicht mit der Domäne verbunden ist, können wir WindowsIdentity oder WindowsPrincipal nicht verwenden und dann die IsInRole() -Methode überprüfen. Die IsInRole() -Methode funktioniert nur, wenn Ihr Computer mit der Domäne verbunden ist und Ihr Domänencomputerkonto S4USelf verwendet.

Sie können den LogonUser-Ansatz auch nicht verwenden, da auf Ihrem Computer keine Anmeldesitzung aus einer nicht vertrauenswürdigen Gesamtstruktur erstellt werden kann.

Ich denke, wir können nur das Active Directory direkt abfragen, um die gewünschten Informationen zu erhalten. Der Code in Ihrer veröffentlichten Microsoft KB funktioniert nicht sehr gut, soweit ich das beurteilen kann. Es versucht, vom memberOf -Attribut abzufragen. Die Gruppeninformationen sind nicht immer über die memberOf-Attribute verfügbar.

Ich schrieb nur eine IsInRole() -Funktion mit AccountManagement. Ich denke, das ist was du willst. Die Funktion IsInRole() ruft eine rekursive Funktion IsInGroup() auf, um alle Gruppen herauszufinden, denen der Benutzer angehört.

Um diese IsInRole() - Funktion zu verwenden, müssen Sie Ihren Domänennamen und Domänenanmeldeinformationen angeben. Wenn der angegebene Benutzername und das Passwort falsch sind, erhalten Sie eine Ausnahme.

Sie benötigen .NET 3.5 SP1, um AccountManagement API zu verwenden. Vielleicht möchten Sie auch darauf achten, hotfix. Die AccountManagement API hat einige Fehler bekommen, wenn sie in einer Umgebung ausgeführt wurde. Möglicherweise müssen Sie den Hotfix anwenden.