2010-05-05 3 views
0

J'écris un utilitaire pour auditer la configuration d'un service WCF. Pour transmettre correctement les informations d'identification du client, via le service WCF à l'arrière SQL, le compte de domaine utilisé pour exécuter le service doit être configuré dans Active Directory avec le paramètre "Approuver cet utilisateur pour la délégation" (Propriétés -> "Délégation "onglet). En utilisant C#, comment accéder aux paramètres de cet onglet dans Active Directory. J'ai passé les 5 dernières heures à essayer de suivre cela sur le web et n'arrive pas à le trouver.Comment interroger les propriétés de délégation d'un compte d'utilisateur Active Directory?

Voici ce que je l'ai fait jusqu'à présent:

using (Domain domain = Domain.GetCurrentDomain()) 

{ Console.WriteLine (domain.Name);

// get domain "dev" from MSSQLSERVER service account 
DirectoryEntry ouDn = new DirectoryEntry("LDAP://CN=Users,dc=dev,dc=mydomain,dc=lcl"); 
DirectorySearcher search = new DirectorySearcher(ouDn); 

// get sAMAccountName "dev.services" from MSSQLSERVER service account 
search.Filter = "(sAMAccountName=dev.services)"; 
search.PropertiesToLoad.Add("displayName"); 
search.PropertiesToLoad.Add("userAccountControl"); 

SearchResult result = search.FindOne(); 
if (result != null) 
{ 
    Console.WriteLine(result.Properties["displayName"][0]); 
    DirectoryEntry entry = result.GetDirectoryEntry(); 

    int userAccountControlFlags = (int)entry.Properties["userAccountControl"].Value; 
    if ((userAccountControlFlags & (int)UserAccountControl.TRUSTED_FOR_DELEGATION) == (int)UserAccountControl.TRUSTED_FOR_DELEGATION) 
     Console.WriteLine("TRUSTED_FOR_DELEGATION"); 
    else if ((userAccountControlFlags & (int)UserAccountControl.TRUSTED_TO_AUTH_FOR_DELEGATION) == (int)UserAccountControl.TRUSTED_TO_AUTH_FOR_DELEGATION) 
     Console.WriteLine("TRUSTED_TO_AUTH_FOR_DELEGATION"); 
    else if ((userAccountControlFlags & (int)UserAccountControl.NOT_DELEGATED) == (int)UserAccountControl.NOT_DELEGATED) 
     Console.WriteLine("NOT_DELEGATED"); 

    foreach (PropertyValueCollection pvc in entry.Properties) 
    { 
     Console.WriteLine(pvc.PropertyName); 
     for (int i = 0; i < pvc.Count; i++) 
     { 
      Console.WriteLine("\t{0}", pvc[i]); 
     } 
    } 

} 

}

Le "userAccountControl" ne semble pas être la propriété correcte. Je pense qu'il est lié à la section "Options du compte" sur l'onglet "Compte", ce qui n'est pas ce que nous cherchons mais c'est le plus proche que j'ai obtenu jusqu'ici. La justification de tout ceci est: Nous n'avons pas la permission d'installer le service dans le contrôle qualité ou dans la production, donc avec nos instructions écrites (qui sont notoirement seulement suivies en partie) je crée un outil qui auditera le setup (WCF et SQL) pour déterminer si l'installation est correcte. Cela permettra à la personne déployant le service d'exécuter cet utilitaire et de vérifier que tout est correctement configuré, ce qui nous évitera des heures de maux de tête et réduira les temps d'arrêt pendant le déploiement.

Répondre

1

Ok, j'avais tort. Lorsque je l'ai exécuté la première fois que userAccountControl n'a pas défini TRUSTED_FOR_DELEGATION. Je ne sais pas si c'était un problème de mise en cache ou non. J'ai ajouté:

entry.RefreshCache (nouvelle chaîne [] {"userAccountControl"});

pour vous assurer qu'il ne met pas en cache la valeur. Je ne sais pas si cela fonctionne ou pas, mais je l'ai ajouté juste au cas où.

1

Probablement trop tard, mais eh ... l'a trouvé, alors j'ai pensé que je le partagerais.

La propriété en question est appelée "msDS-AllowedToDelegateTo" et n'apparaîtra que pour les comptes avec des valeurs SPN configurées, mais elle vous fournit une liste complète de tous les services pour lesquels votre objet est approuvé pour la délégation.

Espérons que cela évitera à quelqu'un d'autre de lire les spécifications kerberos pendant quelques heures.