我无法让 GPO 在启动时运行脚本。该脚本在 Windows 8 计算机组中的每台计算机上创建一个共享文件夹。脚本本身运行良好,但将其附加到 GPO 时出现问题。即使在执行 gpupdate /force 命令并多次重启后,我仍无法运行脚本。
以下是我所知道的情况:
- RSOP 表明正在应用带有脚本的 GPO
- GPResult 指出该脚本尚未运行(经过多次重启)
- 计算机的应用程序或系统事件日志中没有相关事件
- 单独执行脚本效果很好
- 使用 psexec 使用 SYSTEM 凭据运行脚本同样有效
- 将脚本从网络共享移动到本地文件夹(例如 C:\GPOFiles\)没有什么区别,GPO 仍然没有执行脚本。
- 我尝试使用其他更简单的脚本,只是想看看是否是该脚本的问题,但它们也无法运行
- 我可以将其作为登录脚本运行,但如果可能的话,我宁愿将其应用于机器,而不是用户
我不确定如何解决这个问题,有什么想法吗?
注意,我对组策略还不太熟悉,所以我可能错过了一些显而易见的东西。
编辑:
我还尝试从 Windows 7 和 Windows 8 中创建 GPO,结果相同。域控制器是 Windows Server 2008。
这是我正在尝试运行的脚本。:
'==========================================================================
'ShareSetup.vbs
'==========================================================================
Option Explicit
Const FILE_SHARE = 0
Const MAXIMUM_CONNECTIONS = 25
Dim strComputer
Dim objWMIService
Dim objNewShare
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set objNewShare = objWMIService.Get("Win32_Share")
Call sharesec ("C:\Shared", "Shared", "Work Center Share", "Domain Users")
Sub sharesec(Fname,shr,info,account) 'Fname = Folder path, shr = Share name, info = Share Description, account = account or group you are assigning share permissions to
Dim FSO
Dim Services
Dim SecDescClass
Dim SecDesc
Dim Trustee
Dim ACE
Dim Share
Dim InParam
Dim Network
Dim FolderName
Dim AdminServer
Dim ShareName
FolderName = Fname
AdminServer = "\\" & strComputer
ShareName = shr
Set Services = GetObject("WINMGMTS:{impersonationLevel=impersonate,(Security)}!" & AdminServer & "\ROOT\CIMV2")
Set SecDescClass = Services.Get("Win32_SecurityDescriptor")
Set SecDesc = SecDescClass.SpawnInstance_()
'Set Trustee = Services.Get("Win32_Trustee").SpawnInstance_
'Trustee.Domain = Null
'Trustee.Name = "EVERYONE"
'Trustee.Properties_.Item("SID") = Array(1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0)
Set Trustee = SetGroupTrustee("LM", account) 'Replace ACME with your domain name.
'To assign permissions to individual accounts use SetAccountTrustee rather than SetGroupTrustee
Set ACE = Services.Get("Win32_Ace").SpawnInstance_
ACE.Properties_.Item("AccessMask") = 2032127
ACE.Properties_.Item("AceFlags") = 3
ACE.Properties_.Item("AceType") = 0
ACE.Properties_.Item("Trustee") = Trustee
SecDesc.Properties_.Item("DACL") = Array(ACE)
Set Share = Services.Get("Win32_Share")
Set InParam = Share.Methods_("Create").InParameters.SpawnInstance_()
InParam.Properties_.Item("Access") = SecDesc
InParam.Properties_.Item("Description") = "Public Share"
InParam.Properties_.Item("Name") = ShareName
InParam.Properties_.Item("Path") = FolderName
InParam.Properties_.Item("Type") = 0
Share.ExecMethod_ "Create", InParam
End Sub
Function SetAccountTrustee(strDomain, strName)
set objTrustee = getObject("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_Trustee").Spawninstance_
set account = getObject("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_Account.Name='" & strName & "',Domain='" & strDomain &"'")
set accountSID = getObject("Winmgmts:{impersonationlevel=impersonate}!root/cimv2:Win32_SID.SID='" & account.SID &"'")
objTrustee.Domain = strDomain
objTrustee.Name = strName
objTrustee.Properties_.item("SID") = accountSID.BinaryRepresentation
set accountSID = nothing
set account = nothing
set SetAccountTrustee = objTrustee
End Function
据我所知,GPO 甚至没有触碰过该脚本。为了科学起见,我还尝试了以下脚本,但也没有运行:
Dim oShell
Set oShell = WScript.CreateObject ("WScript.Shell")
oShell.run "subst z: ""C:\Shared"""
以下是我配置这些脚本在 GPO 中运行的方法:
答案1
对我来说这有点愚蠢,但我发现了问题所在。我没有通过 Windows 重新启动,而是点击电源按钮关闭机器,然后再次点击以启动它。
我今天重启了 Windows,终于在 Windows 日志中收到错误,这些错误向我展示了脚本无法运行的原因(与域控制器的 WiFi 连接存在各种问题)。经过一些故障排除(主要是使用有线以太网连接)和适当的重启后,我让脚本运行起来了。