我有几个在安装时使用 C# 创建的本地帐户。有一个组策略反过来授予这些新帐户某些权限。
我要解决的问题是如何将组策略推送到新帐户。如果没有应用组策略,应用程序将无法运行。
打开 cmd 提示符并运行 gpupdate /force 可以修复它,但我需要在安装时间和运行时间之间进行更无缝的转换。
我有几个在安装时使用 C# 创建的本地帐户。有一个组策略反过来授予这些新帐户某些权限。
我要解决的问题是如何将组策略推送到新帐户。如果没有应用组策略,应用程序将无法运行。
打开 cmd 提示符并运行 gpupdate /force 可以修复它,但我需要在安装时间和运行时间之间进行更无缝的转换。
这应该够了吧:
private void UpdateGroupPolicy()
{
FileInfo execFile = new FileInfo("gpupdate.exe");
Process proc = new Process();
proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
proc.StartInfo.FileName = execFile.Name;
proc.StartInfo.Arguments = "/force";
proc.Start();
//Wait for GPUpdate to finish
while (!proc.HasExited)
{
Application.DoEvents();
Thread.Sleep(100);
}
MessageBox.Show("Update procedure has finished");
}
我想您可以尝试使用 WMI 调用 gpupdate /force 。编码不多,但它是相当手动的 - 你必须在需要时对每台机器执行它。
Wmic /node:.... 进程调用 create "gpupdate /force"
如果您不是域超级用户,您可能想要添加本地凭据。
解决方案似乎很容易,但我可能误解了你的问题 - 如果是这样,请更新我。
此致,
亚历克斯
您甚至可以将此代码用于远程机器
对于本地机器,不要使用用户名、密码和模拟
private static void UpdateGPO(string machinename)
{
try
{
ConnectionOptions connectionOptions = new ConnectionOptions();
connectionOptions.Username = @"Domain\Administrator";
connectionOptions.Password = "password";
connectionOptions.Impersonation = ImpersonationLevel.Impersonate;
ManagementScope scope = new ManagementScope("\\\\" + machinename + "\\root\\CIMV2", connectionOptions);
scope.Connect();
ManagementClass clas = new ManagementClass(scope, new ManagementPath("Win32_Process"), new ObjectGetOptions());
ManagementBaseObject inparams = clas.GetMethodParameters("Create");
inparams["CommandLine"] = "GPUpdate /force";
ManagementBaseObject outparam = clas.InvokeMethod("Create", inparams, null);
}
catch (Exception ex)
{
}
}