2010-12-23 14 views
2

In unserem System lesen wir Benutzer-Sicherheitsgruppen aus einem Active Directory auf zwei leicht unterschiedliche Arten. In einem Fall fehlen in der Liste der vom AD zurückgegebenen Gruppen die lokalen Domänengruppen. Die Antwort von GetAuthorizationGroups() hängt vom verwendeten PrincipalContext ab. In den fehlgeschlagenen Szenarien gibt GetAuthorizationGroups() nur globale Gruppen zurück. Das Ergebnis fehlen alle lokalen Domänengruppen aus dem AD. Kann mir bitte jemand erklären warum?Benutzerberechtigungsgruppen aus Active Directory lesen

Failing Lösung:

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "our.domain.net"); 

var userPrincipal = UserPrincipal.FindByIdentity(ctx, IdentityType.UserPrincipalName, "userB"); 

PrincipalSearchResult<Principal> groups = userPrincipal.GetAuthorizationGroups(); 

In diesem Fall wird der Prozess von „UserA“ ausgeführt wird. "UserA" ist ein Mitglied der Domain "our.domain.net". "UserA" ist derselbe Benutzer wie der spezifisch identifizierte Benutzer in der Arbeitslösung. Der PrincipalContext sollte deshalb mit dem PrincipalContext in der Arbeitslösung identisch sein. Die Antwort von GetAuthorizationGroups() in dieser Lösung vermisst lokale Domänengruppen aus dem AD.

Arbeitslösung:

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "our.domain.net", "UserA", "PasswordA"); 

var userPrincipal = UserPrincipal.FindByIdentity(ctx, IdentityType.UserPrincipalName, "userB"); 

PrincipalSearchResult<Principal> groups = userPrincipal.GetAuthorizationGroups(); 

In diesem Fall wird der anrufende Benutzer speziell durch die Verwendung Namen und Passwort identifiziert, wenn der Haupt Kontext zu schaffen. In diesem Fall gibt die AD alle Gruppen zurück, denen der Benutzer angehört. Dies ist das Verhalten, das ich auch von der fehlgeschlagenen Lösung sehen möchte. In einigen Fällen habe ich nicht das Benutzerpasswort von UserA und aus diesem Grund ist die Arbeitslösung keine Option.

Bitte helfen Sie mir zu verstehen, warum die fehlgeschlagene Lösung nicht alle Gruppen zurückgibt, denen der Benutzer angehört.

+0

Haben Sie mehr als eine Domain haben? Auf welchem ​​Betriebssystem bist du? Es kann sich auf UAC beziehen. Ich würde versuchen, die Benutzerkontensteuerung auszuschalten und es erneut zu versuchen (denken Sie daran, den Computer neu zu starten, nachdem Sie die Benutzerkontensteuerung deaktiviert haben). FYI, ValidateCredentials() hilft Ihnen nicht, die GetAuthorizationGroups() zu tun, falls Sie dachten, dass es tut –

+0

Danke für Ihre Antwort Harvey. Die Probleme wurden während des Systemtests in unserem Testlabor gefunden. Das Testsystem besteht aus einer einzelnen Domäne und mehreren Domänencontrollern. Der Code in der Problembeschreibung wird von einem Windows 2003-Server ausgeführt. Vor der Veröffentlichung unseres Produkts müssen wir mehrere Domains und Windows 2008 Server unterstützen. Ich habe unseren Windows Server Installation Guru aufgefordert, einige Experimente mit der UAC zu tun. Er murmelte etwas über "Ist das nicht ein Feature von 2008". Er würde sich trotzdem darum kümmern. Ich werde seine Antwort in Kürze veröffentlichen lassen. Mit freundlichen Grüßen, Gunnar – Gunnar

Antwort

1

Endlich haben wir das Problem gefunden. Es stellte sich heraus, dass es überhaupt ein Codierungsproblem war. Das seltsame Verhalten wurde durch eine fehlerhafte Domänenebene im Active Directory verursacht.

Domain-Ebene hatte eingestellt werden, um es zu „2003-Funktionsebene“

Nun sind alle Arbeiten wie erwartet.

1

„Es fehlt Domäne lokale Gruppen aus dem AD“ weil Sie wahrscheinlich die resultierenden groups mit foreach Schleife iteriert werden und Sie bekommen NoMatchingPrincipalException Ausnahme für eine der Gruppen, die der Benutzer muß nicht Lesezugriff hat und an diesem Punkt es hört auf zu iterieren, den Rest der Gruppen nicht zu bekommen.

Als Lösung Sie folgenden Iterator verwenden (den Code hinter der foreach Struktur) den Rest der Gruppen zu erhalten:

var enumerator = groups.GetEnumerator();     
while (enumerator.MoveNext()) 
{ 
    try 
    { 
     var e = enumerator.Current; 
     listView1.Items.Add(e.Name); 
    } 
    catch (NoMatchingPrincipalException) 
    { 
    } 
}