我使用 System.Management.Automation 编写了一个 C# 桌面应用程序,它可以远程连接到我们网络中的计算机并进行诊断,以确保它们均按照我们组织的策略进行配置。
PSCredential Credentials = new PSCredential(Username, Password);
WSManConnectionInfo ThisConnection = new WSManConnectionInfo(false, ThisSystem.IpName, 5985, "/wsman",
"http://schemas.microsoft.com/powershell/Microsoft.PowerShell", Credentials);
using (Runspace ThisRunspace = RunspaceFactory.CreateRunspace(ThisConnection))
{
ThisRunspace.Open();
using (PowerShell ThisShell = PowerShell.Create())
{
ThisShell.Runspace = ThisRunspace;
要获取组策略中的横幅,它会执行以下代码来执行 powershell 命令
ThisShell.Commands.Clear();
ThisShell.AddScript("echo N | gpupdate /force");
ThisShell.AddScript("gpresult /h c:\\Windows\\Temp\\gpdata.html /F");
ThisShell.AddScript("type c:\\Windows\\Temp\\gpdata.html");
List<String> GroupPolicy = ThisShell.Invoke().Select(x => x.ToString()).ToList();
这应该使用该计算机的组策略数据创建该 html 文件。只要我使用相同的凭据手动登录到该计算机,就可以了。如果我没有,我什么也得不到。我像这样运行其他 powershell 命令并得到很好的结果,但由于某种原因,此用于获取组策略的命令仅适用于我至少手动登录(使用远程桌面)一次的计算机,并且有数千个要检查的服务器,这不是一个选项。
我认为可能是登录手动为我正在使用的管理员帐户创建了主文件夹,但这不可能,因为我正在获取通过管道传输到文件的其他 powershell 命令的结果。我认为可能是登录手动更新了该计算机上的组策略,但我认为这也不可能,因为我添加了 gpupdate/force
,并且没有任何区别。
有什么线索吗?
最佳答案
来自 documentation for gpresult :
由于您可以将重叠的策略设置应用于任何计算机或用户,因此组策略功能会在用户登录时生成一组策略设置结果。 gpresult 显示指定用户登录时在计算机上强制执行的策略设置结果集。
由于您正在讨论在服务器上强制执行策略,通常不应期望用户登录,因此也许您可以尝试添加 /scope computer
选项来仅获取计算机策略,它应该始终可用。
关于c# - 在未手动登录至少一次的情况下,无法远程获取计算机的组策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56031286/