高分求解:如何编程修改本地计算机策略(组策略),达到自动修改Windows升级服务器位置

nwp006 2005-06-19 12:14:53
我想在Intranet内设立一台Windows升级服务器(已实现),然后将客户机的Windows升级源都指到这一台服务器。手工修改策略的方法是:
1、用gpedit.msc打开组策略编辑器,确认左边树形菜单中“本地计算机”策略--计算机配置--管理模板--Windows组件 是否有Windows Update。
2、如果没有,则在上述的“管理模板”上点右键选择“添加/删除模板”,然后选择“添加”wuau.adm,然后将出现Windows Update。
3、在Windows Update下设置“配置自动更新”、“指定Intranet Microsoft更新服务位置”。

但考虑到以上办法太麻烦,因此想编程实现。
通过查找特征值,我想通过修改注册表来实现,但未能成功,代码如下:

//停止Windows Automatic Updates服务
winexec(PChar('net stop wuauserv'), SW_HIDE);

Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_LOCAL_MACHINE;
Reg.DeleteKey('\Software\Microsoft\Windows\CurrentVersion\WindowsUpdate\Auto Update');
if Reg.OpenKey('\Software\Policies\Microsoft\Windows\WindowsUpdate', True) then
begin
Reg.WriteString('WUServer','http://10.151.18.114');
Reg.WriteString('WUStatusServer','http://10.151.18.114');
if Reg.OpenKey('\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU', True) then
begin
Reg.WriteInteger('AUOptions',3);
Reg.WriteInteger('NoAutoUpdate',0);
Reg.WriteInteger('ScheduledInstallDay',0);
Reg.WriteInteger('ScheduledInstallTime',3);
Reg.WriteInteger('UseWUServer',1);
Reg.WriteInteger('NoAutoRebootWithLoggedOnUsers',1);
Reg.WriteInteger('RescheduleWaitTime',1);
end;
end;
finally
Reg.CloseKey;
Reg.Free;
end;
//开启Windows Automatic Updates服务
winexec(PChar('net start bits'), SW_HIDE);
winexec(PChar('net start wuauserv'), SW_HIDE);



...全文
2430 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
nwp006 2005-06-26
  • 打赏
  • 举报
回复
前段时间忙,今天回来看了一下,分还是组Kingron吧,谢谢你的关注!
Kingron 2005-06-21
  • 打赏
  • 举报
回复
提示:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/policy/policy/igrouppolicyobject_save.asp
Kingron 2005-06-21
  • 打赏
  • 举报
回复 1
哈哈,终于完美解决问题!!!!
需要GPO接口和注册表操作。
在我的论坛有全部源代码!
Kingron 2005-06-19
  • 打赏
  • 举报
回复
其中有个GUID,需要根据不同计算机而变化,具体如何得到这个GUID,还在研究当中,不过你可以自己找出你的GUID替换代码中的即可!
nwp006 2005-06-19
  • 打赏
  • 举报
回复
在线等待
nwp006 2005-06-19
  • 打赏
  • 举报
回复
我做了测试(因不在办公室,无法验证),但通过以上针对注册表的修改,策略编辑器中查看时还象还是没有体现出现。在注册表中全部删除“WindowsUpdate”键下的相关信息并重启好象也是没有在策略编辑器中体现出来。不是Kingron是如何验证并得出测试通过的?



贴出Kingron的解决办法:
Windows住策略的刷新和修改



By Kingron



Windows有一个gpedit.msc,很好用的一个工具,可以定制Windows很多的配置。但是如果我们需要自己的程序来修改这些配置的话,你会发现Windows的组策略根本不认!但是你修改注册表重新启动机器后,某些配置是起作用的,这个原因在于,我们必须同时刷新系统,而且必须刷新组策略。
Windows组策略会在你的HKCU下建立一个组策略的修改缓冲,必须更新这个缓冲才会同时起作用!
下面以修改Windows的Windows Update配置来说明。



Windows Update的配置存储在HKLM\Software\Policies\Microsoft\Windows\WindowsUpdate下,我们代码为:
if Reg.OpenKey('\Software\Policies\Microsoft\Windows\WindowsUpdate', True) then
begin
Reg.WriteString('WUServer','http://10.151.18.114');
Reg.WriteString('WUStatusServer','http://10.151.18.114');
if Reg.OpenKey('\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU', True) then
begin
Reg.WriteInteger('AUOptions',3);
Reg.WriteInteger('NoAutoUpdate',0);
Reg.WriteInteger('ScheduledInstallDay',0);
Reg.WriteInteger('ScheduledInstallTime',3);
Reg.WriteInteger('UseWUServer',1);
Reg.WriteInteger('NoAutoRebootWithLoggedOnUsers',1);
Reg.WriteInteger('RescheduleWaitTime',1);
end;
end;
写入注册表后重新启动服务器,是可以起作用的,但是组策略不认,刷新后可能会导致配置失效,因此还是必须让组策略接纳我们的修改,组策略的缓冲存储在HKCU\Software\Microsoft\Windows\CurrentVersion\Group Policy Objects\{574DE082-1E91-47C9-95A1-C731CC87F739}Machine\下,其中的GUID为需要修改的用户的GUID,必须在这个Key下建立你的除Root外的Key,并写入你的数据,最后刷新系统即可。
因此完整的代码如下:



uses Registry;



procedure TForm1.Button1Click(Sender: TObject);
var
Reg : TRegistry;
begin
Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.OpenKey('\Software\Policies\Microsoft\Windows\WindowsUpdate', True) then
begin
Reg.WriteString('WUServer','http://10.151.18.114');
Reg.WriteString('WUStatusServer','http://10.151.18.114');
if Reg.OpenKey('\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU', True) then
begin
Reg.WriteInteger('AUOptions',3);
Reg.WriteInteger('NoAutoUpdate',0);
Reg.WriteInteger('ScheduledInstallDay',0);
Reg.WriteInteger('ScheduledInstallTime',3);
Reg.WriteInteger('UseWUServer',1);
Reg.WriteInteger('NoAutoRebootWithLoggedOnUsers',1);
Reg.WriteInteger('RescheduleWaitTime',1);
end;
end;
Reg.RootKey := HKEY_CURRENT_USER;



if Reg.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Group Policy Objects\{574DE082-1E91-47C9-95A1-C731CC87F739}Machine\Software\Policies\Microsoft\Windows\WindowsUpdate', True) then
begin
Reg.WriteString('WUServer','http://10.151.18.114');
Reg.WriteString('WUStatusServer','http://10.151.18.114');
if Reg.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Group Policy Objects\{574DE082-1E91-47C9-95A1-C731CC87F739}Machine\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU', True) then
begin
Reg.WriteInteger('AUOptions',3);
Reg.WriteInteger('NoAutoUpdate',0);
Reg.WriteInteger('ScheduledInstallDay',0);
Reg.WriteInteger('ScheduledInstallTime',3);
Reg.WriteInteger('UseWUServer',1);
Reg.WriteInteger('NoAutoRebootWithLoggedOnUsers',1);
Reg.WriteInteger('RescheduleWaitTime',1);
end;
end;



SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, Integer(PChar('Policies')), 0);
finally
Reg.CloseKey;
Reg.Free;
end;
end;




tfeiy 2005-06-19
  • 打赏
  • 举报
回复
通过了吗?
nwp006 2005-06-19
  • 打赏
  • 举报
回复
每次启动gpedit.msc,HKCU\Software\Microsoft\Windows\CurrentVersion\Group Policy Objects下面的这串值都不同
nwp006 2005-06-19
  • 打赏
  • 举报
回复
在这先谢谢热心的Kingron
nwp006 2005-06-19
  • 打赏
  • 举报
回复
另外我根据10.151.18.114在regedit中查找,将所在的WindowsUpdate键都删除,并且在GPEdit.msc中也删除wuau模板,然后重启后再添加wuau模板(对应wuau.adm),发现原来的设置都还在(含10.151.18.114)
Kingron 2005-06-19
  • 打赏
  • 举报
回复
的确是这样的,所以还在研究当中,已经去M$新闻组问了,等下看看有没有答案,问题即使每次运行会变化,只要我们把这个GUID替换到代码中运行,你回到gpedit.msc,你会发现组策略已经更新成功了。我怀疑这个更新需要用到WMI,你可以看看这个文件:%system%wbem\Repository\FS\OBJECTS.DATA
里面会变化的,这个文件为WMI的一些缓冲数据,如何更新到WMI中,还不清楚~~~~~~
nwp006 2005-06-19
  • 打赏
  • 举报
回复
to Kingron:我也知道这串数字是不同的,原先也根据我的情况换过来了,刚才又特别根据你的提示检查了一下,发现这串数字是变化的,每次使用GPEdit.msc产生的都不同
Kingron 2005-06-19
  • 打赏
  • 举报
回复
你可以这样测试:

启动GPEdit.msc,找到

HKCU\Software\Microsoft\Windows\CurrentVersion\Group Policy Objects,记录下下面的GUID,然后把上面代码中的GUID替换为你记录下的GUID,然后运行程序,回到组策略,你会发现已经修改了~~~~~~
Kingron 2005-06-19
  • 打赏
  • 举报
回复
完美答案,测试通过:
http://kingron.delphibbs.com ,技术讨论区--〉编程技巧
http://www.soulan.com/kingron/dispbbs.asp?boardid=17&id=525

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧