2016-09-19 4 views
0

Meine Rolle auf der Entwicklerseite. Ich habe eine Anwendung, die ich versuche zu überprüfen, ob ein Benutzer Zugriff auf eine Freigabe hat. In der Anwendung überprüfe ich die Gruppen auf dieser Freigabe. Dann überprüfe ich alle Gruppen die Benutzer inActive Directory - Cross-Domains

In einem Fall, ich nicht in der Lage, die lokale Gruppe, um zu sehen, dass die Benutzer in beiden Code sind oder die AD in Windows . Zum Beispiel:

Domäne A \ User1>Domain A \ Global Group> wenn Sie nicht sehen: Domain B \ Local Group

Aber wenn ich von Domain BI aussehen sehen:

Teile>Domain B \ Local Group>Domain A \ Global Group> Do Domain A \ User1 nicht

Gibt es eine Sicherheitseinstellung sehen, die nicht richtig eingestellt ist, da ich in dem Windows-Tool nicht sehen oder Code.

aktualisieren

ich den folgenden Code versucht haben. Ich bin immer noch nicht in der Lage zu sehen Domain B \ Lokale Gruppe.

string account = "{User**Or**Group}"; 
string domain = "{Domain}"; 

string dn = ADHelper.GetDistinguishedName(domain, account); 

using (var forest = Forest.GetCurrentForest()) 
{ 
      foreach (Domain domainName in forest.Domains) 
      { 
       Console.WriteLine(string.Format("Domain: {0}", domainName.Name)); 
     Console.WriteLine("========================================================"); 
       GetAllGroups(dn, domainName.Name); 
       domainName.Dispose(); 
      } 
     } 

void GetAllGroups(string dn, string domain) 
{ 

    DirectorySearcher ds = new DirectorySearcher(string.Format("GC://{0}", domain)); 
    ds.Filter = String.Format("(&(distinguishedName={0}))", dn); 

    SearchResult sr = ds.FindOne(); 

    if (sr == null) 
     return; 
    DirectoryEntry Diruser = sr.GetDirectoryEntry(); 
    Diruser.RefreshCache(new string[] { "tokenGroups" }); 

    for (int i = 0; i < Diruser.Properties["tokenGroups"].Count; i++) 
    { 
     SecurityIdentifier sid = new SecurityIdentifier((byte[])Diruser.Properties["tokenGroups"][i], 0); 
     try 
     { 
      NTAccount nt = (NTAccount)sid.Translate(typeof(NTAccount)); 
      Console.WriteLine(nt.Value + "\t" + domain); 
     } 
     catch { } 
    } 

} 

Antwort

1

Um alle Gruppen abzurufen Benutzer gehören Sie einen globalen Katalog in jeder Domäne des gesamten Waldes abzufragen haben für die Mitgliedschaft des Benutzers (Benutzer-tokengroups-Attribut finden Sie verschachtelte Gruppen und zurück), dann dupliziert entfernen Gruppen.

Beachten Sie, dass Active Directory in einer Abfrage nicht mehr als 5K Werte eines einzelnen Attributs zurückgeben kann. Wenn ein Benutzer mehr als 10K-Gruppen angehört, gibt AD nur die ersten 5K zurück. Sie müssen eine Methode namens Range Retrieval verwenden, um in diesem Fall nach einer Mitgliedschaft zu suchen.

Außerdem kann es einige externe vertrauenswürdige Domänen geben, die Sie ebenfalls behandeln müssen.

Eine andere Lösung besteht darin, mithilfe der GetEffectiveRightsFromAcl-Funktion effektive Benutzerberechtigungen für die angegebene Freigabe zu berechnen. Die Lösung wird beschrieben here

Beachten Sie, dass Sie SE_OBJECT_TYPE.SE_LMSHARE als und Objekttyp an die Funktion übergeben müssen.

+0

Danke Dmitry. Ich werde das überprüfen. – H20rider

+0

Ich konnte die Gruppen, in denen der Benutzer Teil der anderen Domäne war, nicht finden. Irgendwelche Ideen wie man das macht? Btw der GetEffectiveRightsFromAcl wird nicht funktionieren, da ich den Pfad zeigen muss, wie die Benutzer die Erlaubnis zu einer Freigabe haben – H20rider

+0

Nur auf der gleichen Seite bestätigen Sie bitte, dass Sie Folgendes getan haben: 1. Stellen Sie eine Verbindung zu GC von Domäne A her. Binden an einen angegebenen Benutzer aus Domäne A. 3. Fragen Sie das Attribut tokenGroups ab. 4. Stellen Sie eine Verbindung mit GC aus Domäne B her. 5. Binden Sie an denselben Benutzer von Domäne A auf diesem GC. 6. Fragen Sie nach dem Attribut tokenGroups für diesen Benutzer auf diesem GC. – oldovets