1

我有几个在安装时使用 C# 创建的本地帐户。有一个组策略反过来授予这些新帐户某些权限。

我要解决的问题是如何将组策略推送到新帐户。如果没有应用组策略,应用程序将无法运行。

打开 cmd 提示符并运行 gpupdate /force 可以修复它,但我需要在安装时间和运行时间之间进行更无缝的转换。

4

3 回答 3

6

这应该够了吧:

    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");
    }
于 2013-08-12T19:44:54.397 回答
1

我想您可以尝试使用 WMI 调用 gpupdate /force 。编码不多,但它是相当手动的 - 你必须在需要时对每台机器执行它。

Wmic /node:.... 进程调用 create "gpupdate /force"

如果您不是域超级用户,您可能想要添加本地凭据。

解决方案似乎很容易,但我可能误解了你的问题 - 如果是这样,请更新我。

此致,

亚历克斯

于 2013-08-21T19:43:43.967 回答
1

您甚至可以将此代码用于远程机器

对于本地机器,不要使用用户名、密码和模拟

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)
            {

            }
        }
于 2013-08-14T17:50:47.643 回答