我创建了一个 GPO 启动脚本,用于在特定 AD 容器中的计算机执行。该脚本从 AD netlogon 共享中获取一个文件,并将其放在计算机上的目录中。如果具有正确的权限(即:我自己),则可以正常执行该脚本并复制文件。但它在启动时不起作用 - 文件不会从 AD 服务器复制过来。
启动脚本应该以 localsystem 身份运行(我说得对吗?)。那么问题是为什么文件在启动时没有复制?可能是因为:
- 这是本地系统用户的权限吗?
- 启动时读取注册表有问题吗?
- 启动时从 AD netlogon 文件夹获取文件有问题?
- 我是不是完全错过了什么?
我的测试机器确实具有脚本中描述的注册表项和本地目录。我自己在测试机器上拥有标准用户权限。AD 服务器是 Windows 2008,测试客户端是 Windows XP SP3(很快就会是 Windows 7,我认为权限问题将不可避免)
Dim wShell, fso, oraHome, tnsHome, key, srcDir
Set wShell = WScript.CreateObject("WScript.Shell")
Set fso = CreateObject("Scripting.FileSystemObject")
key = "HKLM\Software\Oracle\Oracle_Home"
On Error Resume Next
orahome = wShell.RegRead(key)
If err.Number = 0 Then
tnsHome = oraHome + "\" + "network\admin\"
srcDir = wShell.ExpandEnvironmentStrings("%logonserver%") + "\netlogon\UpdatedFiles\"
fso.CopyFile srcDir + "file1.ext", tnsHome, true
End If
附注:为了确保脚本正确部署,我故意在脚本中放入一些错误,下次启动时就会出现错误消息。所以我知道 GPO 已正确部署。
答案1
在本地系统帐户下运行,该脚本将使用 AD 计算机帐户(即 COMPUTERNAME$)连接到网络。
但是,%logonserver% 变量在系统帐户上下文中可能无效 - 毕竟本地系统帐户通过本地计算机而不是域进行身份验证。%logonserver% 变量可能为空,或等于本地计算机名称。
尝试使用\\domain.name\NETLOGON
。这将连接到域控制器(由于 NETLOGON 共享使用 FRS,因此在所有 DC 上都包含相同的文件,因此与哪个 DC 通信并不重要。
答案2
嗯...你的做法应该有效。我知道这没什么安慰作用,但我用的是很多启动脚本(每天在我的客户站点的客户端计算机上调用数千次),并且我没有遇到脚本执行可靠性问题。
我会在注册表读取后添加“On Error Goto 0”,以便报告脚本执行中的任何其他错误。我还考虑至少在测试时添加一些 MsgBox 调用来报告您为 fso.CopyFile 调用构建的值。基本上,使用“PRINT”语句进行调试。
这并没有什么帮助,但是下面是我使用批处理文件执行此操作的方法:
@echo off
for /f "usebackq tokens=2*" %%i in (`reg query HKLM\Software\Oracle /v Oracle_Home ^| find /i "Oracle_Home"`) do (
if not "%%j"=="" copy /y "\\%USERDOMAIN%\netlogon\UpdatedFiles\some_file.tns" "%%j"
)
另外:在 Windows 7 下运行启动脚本不应该有权限问题。该脚本将以 SYSTEM 身份运行,并且不会启用 UAC。微软做对了。