Чтение локальной групповой политики / настроек Active Directory - PullRequest
5 голосов
/ 01 октября 2009

Я пишу программу на C #, которая будет обеспечивать сложность пароля в соответствии с параметром групповой политики Windows «Пароль должен соответствовать требованиям к сложности». В частности, если для этой политики установлено значение «Включено» либо на локальном компьютере (если он не является частью домена), либо в соответствии с политикой безопасности домена (для членов домена), тогда моему программному обеспечению необходимо ввести сложный пароль для собственной внутренней безопасности.

Проблема в том, что я не могу понять, как прочитать этот параметр GPO. Поиски в Google показали, что я могу читать настройки GPO с помощью одного из этих двух API: библиотеки System.DirectoryServices в .NET Framework и инструментария управления Windows (WMI), но пока я не добился успеха.

Любые идеи будут полезны.

Ответы [ 3 ]

7 голосов
/ 02 июня 2010

Кажется, что нет задокументированного API для этой задачи, управляемой или нет.

Управляемая попытка

Я попробовал управляемый маршрут, используя 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"]);
        }

Это, однако, не даст результатов. Похоже, это не проблема разрешения, поскольку предоставление пары имя пользователя / пароль для ConnectionOptions приводит к исключению, сообщающему, что вы не можете указать имя пользователя при локальном подключении.

Неуправляемая попытка

Я посмотрел на NetUserModalsGet . Пока это вернет некоторую информацию о настройках пароля:

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;

.. не сообщит, включена ли политика Сложность пароля .

Очистка выходных данных инструмента 'Success'

Итак, я прибег к анализу 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 = 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;
    }

Полный код здесь: http://gist.github.com/421802

0 голосов
/ 27 октября 2010

Я наткнулся на ваш ответ на этом форуме Microsoft http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/f3f5a61f-2ab9-459e-a1ee-c187465198e0

Надеюсь, это поможет кому-то, кто столкнется с этим вопросом в будущем.

0 голосов
/ 02 ноября 2009

Вы можете использовать инструменты Resultant Set of Policy (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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...