C# 正在读取本地组策略/Active Directory设置

C# 正在读取本地组策略/Active Directory设置,c#,.net,active-directory,group-policy,C#,.net,Active Directory,Group Policy,我正在编写一个C程序,它将根据Windows组策略设置强制执行密码复杂性。密码必须满足复杂性要求。具体地说,如果该策略在本地计算机上(如果它不是域的一部分)或由域成员的域安全策略设置为启用,则我的软件需要为其自身的内部安全强制使用复杂密码 问题是我不知道如何读取GPO设置。谷歌搜索表明,我可以通过以下两个API之一读取GPO设置:.NET Framework中的System.DirectoryServices库和Windows Management Instrumentation WMI,但到目

我正在编写一个C程序,它将根据Windows组策略设置强制执行密码复杂性。密码必须满足复杂性要求。具体地说,如果该策略在本地计算机上(如果它不是域的一部分)或由域成员的域安全策略设置为启用,则我的软件需要为其自身的内部安全强制使用复杂密码

问题是我不知道如何读取GPO设置。谷歌搜索表明,我可以通过以下两个API之一读取GPO设置:.NET Framework中的System.DirectoryServices库和Windows Management Instrumentation WMI,但到目前为止我还没有取得任何成功


任何见解都会有帮助。

您可以使用策略RSOP工具的结果集。这里有一个从中提取的VBScript,它将告诉您需要知道的内容。将其转换为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

对于此任务,无论是托管还是其他方式,似乎都没有文档化的API

有管理的尝试 我使用程序集尝试了托管路由:

        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"]);
        }
但是,这不会返回结果。这似乎不是权限问题,因为向ConnectionOptions提供用户名/密码对会导致异常,告诉您在本地连接时无法指定用户名

非托管尝试 我看了看。虽然这将返回有关密码设置的一些信息:

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;
…它不会告诉您策略是否已启用

刀具输出刮削“成功” 所以我求助于解析输出


这里的完整代码:

我找到了你的Microsoft论坛答案


希望这对将来遇到这个问题的人有所帮助。

WMI RSOP_Xxx方法似乎无法在本地系统上工作,未找到实例。它适用于我的领域驱动系统。
    public static bool PasswordComplexityPolicy()
    {
        var tempFile = Path.GetTempFileName();

        Process p = new Process();
        p.StartInfo.FileName = Environment.ExpandEnvironmentVariables(@"%SystemRoot%\system32\secedit.exe");
        p.StartInfo.Arguments = String.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 passwordComplexityString = "";
        var passwordComplexity = 0;

        return file.Sections.TryGetValue("System Access", out systemAccess)
            && systemAccess.TryGetValue("PasswordComplexity", out passwordComplexityString)
            && Int32.TryParse(passwordComplexityString, out passwordComplexity)
            && passwordComplexity == 1;
    }