Laden...

Active Directory-Abfrage tut nicht...

Erstellt von aziegler vor 16 Jahren Letzter Beitrag vor 15 Jahren 6.380 Views
A
aziegler Themenstarter:in
3 Beiträge seit 2007
vor 16 Jahren
Active Directory-Abfrage tut nicht...

Hallo zusammen.

Erstmal hoffe ich, dass hier das richtige Forum ist...

Ich möchte folgendes tun: Für ein größeres Programm (ein Web Service) benötige ich Infos aus dem Active Directory über die Benutzergruppen eines einzelnen Users. Genauer gesagt muss ich herausfinden, ob der User in einer bestimmten Gruppe drin ist oder nicht. Da das meine erste AD-Abfrage in einem C#-Programm ist, mag der Code holprig/merkwürdig aussehen...naja, er funktioniert ja auch nicht.

Die entscheidenden Teile sind diese hier:


public bool GetADUserGroups(string userName, string gruppe)
    {
        bool ergebnis = false;
        
        DirectoryEntry ebr = new DirectoryEntry("LDAP://DOMAINE.DO","DOMAIN_USER","PASSWORD");

/*(reicht hier ein normaler Domain User oder muss das ein Domain Admin sein??)*/
            
        DirectorySearcher search = new DirectorySearcher(ebr);

/*(das sind jetzt die verschiedenen Filtervarianten, die ich ausprobiert habe; sind alle mit Ausnahme der nicht auskommentierten mit Fehler abgebrochen)*/
        
        //search.Filter = String.Format("(cn={0})", userName);
        
        //search.Filter = String.Format("&(objectClass=user)(userprincipalname={0})", userName);

        //search.Filter = "&(objectClass=user)(userprincipalname=" + userName + ")";

        search.Filter = "(objectClass=user)";

/*(der Username wird übrigens in der Form "vorname.nachname", sprich der Login-Name, übergeben)*/
                      
        search.PropertiesToLoad.Add("memberOf");
        search.PropertiesToLoad.Add("samAccountName");
             
            foreach (SearchResult table in search.FindAll())
            {
                int groupCount = table.Properties["memberOf"].Count;

                logger.LogInfo(table.Properties["samAccountName"].ToString());

                if (table.Properties["samAccountName"].ToString() == userName)
                {

                    for (int i = 0; i < groupCount; i++)
                    {
                        logger.LogInfo(table.Properties["memberOf"][i].ToString());

                        if (table.Properties["mebmerOf"][i].ToString() == gruppe)
                        {
                            ergebnis = true;
                        }
                    }
                }
            }
       
       
        return ergebnis;
    }

Tja, und langsam fällt mir nicht mehr viel ein. Ich probiere weiter rum, aber ich komme mir vor wie einer, der im tief-trüben fischt...

Über Hilfe wäre ich sehr dankbar!

H
4 Beiträge seit 2007
vor 16 Jahren

Hallo,

Bin momentan am selben dran, jedoch etwas aufwändiger/komplizierter als du.


using System.DirectoryServices;
using System.Collections;

ArrayList GetADGroupUsers(string groupName)
        {    
            SearchResult result;
            DirectorySearcher search = new DirectorySearcher();
            search.Filter = String.Format("(cn={0})", groupName);
            search.PropertiesToLoad.Add("member");
            result = search.FindOne();

            ArrayList userNames = new ArrayList();
            if (result != null)
            {
                for (int counter = 0; counter < 
                         result.Properties["member"].Count; counter++)
                {
                    string user = (string)result.Properties["member"][counter];
                    userNames.Add(user);
                }
            }
            return userNames;
        }


So kannst du dir die User einer Domain Gruppe auslesen lassen. Danach kannst du einen bestimmten User aus dem Array suchen/auslesen.

Grüsse,
Helium

A
aziegler Themenstarter:in
3 Beiträge seit 2007
vor 16 Jahren

Danke!

Für ganz simple Sachen (habe ich aus 'ner ADSI-Community) kann man aber auch über die WindowsIdentity gehen, zumindest wenn man in einer Windows Server 2003-Umgebung arbeitet.

Mit Hilfe des passenden Anmeldenamens (loginname@domain.do) kann man sich über System.Security.Principal eine WindowsIdentity und damit einen WindowsPrincipal erstellen und dort gibt's eine Funktion, die überprüft, in welchen Gruppen dieser User ist. Funktioniert etwas einfacher. Vielleicht hilft dir das ja auch.

H
10 Beiträge seit 2007
vor 16 Jahren
Anmeldung

Hallo aziegler :

Kannst du bitte das Beispiel, das du im letzten Beitrag erwähnt hast , hier posten.
(Anmeldung an Active directory , User und Usergruppe identifizieren !)
Ich hange jetzt seit einer Woche bei der Anmeldung zu einem Active directory..

Danke im Voraus !

A
aziegler Themenstarter:in
3 Beiträge seit 2007
vor 16 Jahren

Kein Problem, bin ja froh, wenn ich auch mal helfen kann.

Bei mir ist das ein zweigeteiltes Programm, eins läuft clientseitig, eins serverseitig. Das hängt aber mit der Struktur hier zusammen und sollte bei deinem Problem nicht wichtig sein.

Zunächst einmal lese ich den aktuellen User aus:


string benutzer = System.Security.Principal.WindowsIdentity.GetCurrent().Name.ToString();

(Damit die Zeile funktioniert, benötigst du die Bibliotheken System.Security und System.Security.Principal im using-Statement)

Den wandele ich dann um, damit er für die WindowsIdentity später verwendet werden kann. Die benötigt nämlich den Usernamen in der Form "username@domäne.bla" (z.B. "max.mustermann@gesellschaft.com"). Hierfür benutze ich die Funktion "Stringmanipulation". "GetCurrent" liefert den User nämlich in der Form "Domäne\Username" zurück (also "Gesellschaft\Max.Mustermann").


benutzer = stringmanipulation(benutzer);

(...)


public string stringmanipulation (string benutzer)
		{
			int stringlaenge = benutzer.Length - 1;
			int cutoff = 0;
			string backslash = "\\";
				
			for (int i=0; i <= stringlaenge; i++)
			{
				if (benutzer[i].ToString() == backslash.ToString())
					cutoff = i;

			}

			string benutzerp2 = benutzer.Substring(cutoff+1,stringlaenge-cutoff);
			string benutzerp1 = benutzer.Substring(0,cutoff);

			benutzer = benutzerp2 + "@" + benutzerp1 + ".com";

			return benutzer;
		}

Jetzt habe ich den aktuellen User in der gewünschten Form.

Jetzt fülle ich eine String-Variable mit der AD-Gruppe, gegen die ich suche.


string adgroup = "AD-Gruppe";

Und jetzt teste ich dagegen mit dieser (selbstgeschriebenen) Funktion:


bool ergebnis = CheckWindowsIdentity(benutzer, adgroup);

(...)


public bool CheckWindowsIdentity(string user, string gruppe)
    {
        System.Security.Principal.WindowsIdentity wi = new WindowsIdentity(user);
        System.Security.Principal.WindowsPrincipal wp = new WindowsPrincipal(wi);

        bool ergebnis = wp.IsInRole(gruppe);

        return ergebnis;

    }

Und fertig. Ich hoffe, das hilft etwas. 🙂

92 Beiträge seit 2006
vor 15 Jahren
danke

DANKE! Bin per Zufall auf diese Variante gestossen. Muss auch alle User einer Gruppe ausgeben...

Wirklich sauber! THX

K
71 Beiträge seit 2005
vor 15 Jahren

Hallo aziegler

Falls du einen Webservice-Aufruf nur für eine Bestimmte Windows-Gruppe zulassen willst, empfehle ich dir WCF.
Mit dem richtigen Binding kannst du dort bequem direkt die WindowsIdentity (Vom Aufrufer) herauslesen.

Gruss Fellmer