C#gpresult / r等价物

时间:2014-07-08 21:22:46

标签: c# group-policy

我正在编写一个小应用程序,用于检查计算机和当前用户是否是Active Directory中相应安全组的成员。我偶然发现了这个问题LINK,但看起来它已被遗忘,我遇到了与OP相同的问题。最终结果是我希望能够创建一个与从命令提示符运行以下命令非常相似的数组。

gpresult /r

以下是我从上面的链接尝试过的代码示例,我特意遇到与OP相同的错误"超出范围"例外"尝试设置LoggingUser和LoggingComputer时。由于我无法克服这些错误,我甚至不确定这种方法是否正确。

GPRsop rsop = new GPRsop(RsopMode.Logging, "root\\RSOP\\Computer");
rsop.LoggingComputer = "MyComputer";
rsop.LoggingUser = "domain\\user";
rsop.LoggingMode = LoggingMode.Computer;
rsop.CreateQueryResults();
rsop.GenerateReportToFile(ReportType.Xml, "C:\\Temp\\test.xml");

1 个答案:

答案 0 :(得分:0)

通过阅读位于" HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Group Policy \ History"中的注册表项,我找到了一种迂回的方式来完成我所需要的工作。对于应用的组策略,将它们添加到ArrayList,然后检查列表是否包含我感兴趣的策略。

为了确保动态更新这些密钥,我从GPO组中删除了有问题的计算机,重新启动并删除了与该策略关联的密钥。

            ArrayList groupPolicies = new ArrayList();

        using (RegistryKey historyKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\History"))
        {
            foreach (string historySubkey in historyKey.GetSubKeyNames())
            {
                using (RegistryKey guidKey = historyKey.OpenSubKey(historySubkey))
                {
                    foreach (string guidsubkey in guidKey.GetSubKeyNames())
                    {
                        using (RegistryKey keyvalue = guidKey.OpenSubKey(guidsubkey))
                        {
                            groupPolicies.Add(keyvalue.GetValue("DisplayName"));
                            //Console.WriteLine(keyvalue.GetValue("DisplayName"));
                        }
                    }
                }
            }
        }
        if (!groupPolicies.Contains("replacewithyourGPOname"))
        {
            Console.WriteLine("The machine is not a member of the policy");
        }