gpt4 book ai didi

c# - 读取本地组策略/Active Directory 设置

转载 作者:太空狗 更新时间:2023-10-29 23:04:37 25 4
gpt4 key购买 nike

我正在编写一个 C# 程序,它将根据 Windows 组策略设置“密码必须满足复杂性要求”强制执行密码复杂性。具体来说,如果该策略在本地计算机(如果它不是域的一部分)上或通过域安全策略(对于域成员)设置为启用,那么我的软件需要强制执行复杂的密码以确保其内部安全。

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

任何见解都会有所帮助。

最佳答案

似乎没有用于此任务的文档化 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;

..它不会告诉我们 Password Complexity策略已启用。

工具输出抓取“成功”

所以我求助于解析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

关于c# - 读取本地组策略/Active Directory 设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1501234/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com