【问题标题】:How to programatically update group policy? i.e. gpupdate /force如何以编程方式更新组策略?即 gpupdate /force
【发布时间】:2023-04-03 11:19:01
【问题描述】:

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

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

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

【问题讨论】:

  • “安装时间和运行时间之间的更无缝过渡”是什么意思?是否要隐藏 cmd 窗口?
  • 我宁愿在不使用命令窗口的情况下执行操作。
  • 相关帖子 - C# SCCM - Client Action

标签: c# .net active-directory wmi group-policy


【解决方案1】:

这应该可以解决问题:

    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");
    }

【讨论】:

  • 这是正常现象,因为某些 GPOS(如文件夹重定向/用户软件安装)无法在后台应用,因此需要重新登录。
  • 尝试将“/wait:0”添加到“/force”之后的StartInfo.Arguments (hardforum.com/showthread.php?t=1313045)
  • 你可以添加 proc.WaitForExit();和 MessageBox.Show("更新程序已完成");在方法结束时。但是程序会冻结,直到 gpupdate 完成。
  • 查看我更新的解决方案,程序不会挂起。顺便说一句:Teknikaali 的解决方案有效吗?
  • 您也可以使用 EventLog.EntryWritten Event 注册到在将某些内容写入事件日志后启动的事件
【解决方案2】:

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

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

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

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

最好的问候,

亚历克斯

【讨论】:

    【解决方案3】:

    您甚至可以在远程机器上使用此代码

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多