Windows注销脚本来修改HKCU下的registry

我试图在注销时修改HKCU中的registry项。 手动调用时,相应的脚本可以正常工作。 我担心可能会出现环回策略问题,但根据rsop.msc,情况并非如此,即脚本应该执行。 但是,registry中的所需效果在下次login时不存在。

有没有一个普遍的问题,只是因为脚本运行“太迟”? 如果是的话,可以做些什么? 还有什么呢?

编辑:我应该指定什么我的logoff.vbs脚本看起来像(最小化):

 const HKCU = &H80000001 Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv") ' ... oReg.SetStringValue HKCU,"SOFTWARE\Foo","Bar", "Baz" 

我经常使用注销脚本。 用户的registry仍然在脚本运行时加载,并且可以对其registry进行修改。 注销脚本按devise同步运行。 我有从用户的registry中读取的注销脚本,但我从来没有机会写。 即使如此,我期望它会正常工作。

我将上面的代码片段放在一个文件中,并将其作为Windows XP SP3虚拟机上本地组策略中的注销脚本,并获得所需的结果。 我将HKCU\Software\Foo\Bar等于xxx ,注销,再次login,并发现该值已按预期更改为Baz

除了脚本执行,我认为你还有其他一些问题。 我添加了一个MsgBox调用的代码,所以我可以“看到”在注销运行的代码。 添加MsdBox并没有改变与registry有关的行为,但是给了我一个代码运行的视觉指示(并且在我解散对话框之前进行了注销注销)。

(如果您愿意,我也可以继续在Windows 7上进行testing,但是我预计function没有变化。)

我想象你正在使用reg.exe修改registry项。 问题是reg.exe运行在一个单独的进程中,而注销脚本只能等待自己完成。 因此,在编辑完成之前,registryconfiguration单元可能会被卸载。

我认为你可以使用两行WScript来解决这个问题,就像下面的例子:

 Set objShell = CreateObject("WScript.Shell") objShell.Run "REG ADD HKCU\key ...",,true 

objShell.Run的第三个参数叫做bWaitOnReturn ,它告诉脚本在继续执行之前等待外部进程完成。

其实有两个问题。

首先,在环回策略的存在下,用户必须小心使用rsop.msc,因为只使用默认值(即在select用户和计算机容器后勾选“跳转到向导的最后一页而不收集更多数据”)可能不会反映真正的政策结果。 必须至less在第二页上打勾回环(并replace或合并)以获得切合实际的结果。 如果在注销时运行脚本,在这里小心有助于正确诊断。

其次,如果SetStringValue不存在, SetStringValue创build值,但不会创build不存在的键。 因此,

oReg.CreateKey HKCU,"SOFTWARE\Foo"

必须在脚本中发布(为了logging, CreateKey recursion地创build不存在的键,但当然“HKCU \ SOFTWARE”已经存在)。