Чтение Локальной Групповой политики / Настройки Active Directory

Если можно использовать IronPython, существует TagLibSharp. Это может использоваться с любого языка.NET .

5
задан Shinobi 30 September 2009 в 23:41
поделиться

2 ответа

Вы можете использовать Результирующий набор политик (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
0
ответ дан 14 December 2019 в 08:55
поделиться

Похоже, что для этой задачи нет задокументированного 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;

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

Инструмент извлекает «Успешно»

Итак, я прибег к синтаксическому анализу выходных данных 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

7
ответ дан 14 December 2019 в 08:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: