Lecture des parameters de stratégie de groupe locale / Active Directory

J’écris un programme C # qui appliquera la complexité du mot de passe conformément au paramètre de stratégie de groupe Windows “Le mot de passe doit répondre aux exigences de complexité”. Plus précisément, si cette stratégie est définie sur Activé sur la machine locale (si elle ne fait pas partie d’un domaine) ou par la stratégie de sécurité du domaine (pour les membres du domaine), mon logiciel doit alors appliquer un mot de passe complexe pour sa propre sécurité interne.

Le problème est que je ne peux pas comprendre comment lire ce paramètre de GPO. Des recherches Google ont indiqué que je pouvais lire les parameters d’object de stratégie de groupe avec l’une de ces deux API: la bibliothèque System.DirectoryServices dans .NET Framework et Windows Management Instrumentation (WMI), mais je n’ai pas eu de succès jusqu’à présent.

Toute idée serait utile.

Il ne semble pas exister d’API documentée pour cette tâche, gérée ou autre.

Tentative gérée

J’ai essayé l’itinéraire géré à l’aide de l’assembly System.Management :

ConnectionOptions options = new ConnectionOptions(); ManagementScope scope = new ManagementScope(@"\\.\root\RSOP\Computer", options); ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, new ObjectQuery("SELECT * FROM RSOP_SecuritySettingBoolean")); foreach(ManagementObject o in searcher.Get()) { Console.WriteLine("Key Name: {0}", o["KeyName"]); Console.WriteLine("Precedence: {0}", o["Precedence"]); Console.WriteLine("Setting: {0}", o["Setting"]); } 

Cela ne retournera toutefois pas les résultats. Il ne semble pas que ce soit un problème d’autorisation car, si une paire nom d’utilisateur / mot de passe est associée à ConnectionOptions une exception vous indique que vous ne pouvez pas spécifier de nom d’utilisateur lors de la connexion locale.

Tentative non gérée

J’ai regardé NetUserModalsGet . Bien que cela renvoie des informations sur les parameters de mot de passe:

 typedef struct _USER_MODALS_INFO_0 { DWORD usrmod0_min_passwd_len; DWORD usrmod0_max_passwd_age; DWORD usrmod0_min_passwd_age; DWORD usrmod0_force_logoff; DWORD usrmod0_password_hist_len; } USER_MODALS_INFO_0, *PUSER_MODALS_INFO_0, *LPUSER_MODALS_INFO_0; 

..il ne laissera pas dire si la stratégie de complexité de mot de passe est activée.

Sortie réussie de l’outil

J’ai donc eu recours à l’parsing de la sortie secedit.exe .

  public static bool PasswordComplexityPolicy() { var tempFile = Path.GetTempFileName(); Process p = new Process(); p.StartInfo.FileName = Environment.ExpandEnvironmentVariables(@"%SystemRoot%\system32\secedit.exe"); p.StartInfo.Arguments = Ssortingng.Format(@"/export /cfg ""{0}"" /quiet", tempFile); p.StartInfo.CreateNoWindow = true; p.StartInfo.UseShellExecute = false; p.Start(); p.WaitForExit(); var file = IniFile.Load(tempFile); IniSection systemAccess = null; var passwordComplexitySsortingng = ""; var passwordComplexity = 0; return file.Sections.TryGetValue("System Access", out systemAccess) && systemAccess.TryGetValue("PasswordComplexity", out passwordComplexitySsortingng) && Int32.TryParse(passwordComplexitySsortingng, out passwordComplexity) && passwordComplexity == 1; } 

Code complet ici: http://gist.github.com/421802

Vous pouvez utiliser les outils RSOP (Resultant Set of Policy). Par exemple, voici un VBScript (soulevé d’ ici ) qui vous indiquera ce que vous devez savoir. Cela devrait être assez simple pour traduire cela en C #.

 strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\rsop\computer") Set colItems = objWMIService.ExecQuery _ ("Select * from RSOP_SecuritySettingBoolean") For Each objItem in colItems Wscript.Echo "Key Name: " & objItem.KeyName Wscript.Echo "Precedence: " & objItem.Precedence Wscript.Echo "Setting: " & objItem.Setting Wscript.Echo Next 

Je suis tombé sur votre réponse à ce forum Microsoft http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/f3f5a61f-2ab9-459e-a1ee-c187465198e0

J’espère que cela aidera quelqu’un qui rencontrera cette question à l’avenir.