![VBScript:将现有 GPO 链接到新 OU](https://linux22.com/image/554217/VBScript%EF%BC%9A%E5%B0%86%E7%8E%B0%E6%9C%89%20GPO%20%E9%93%BE%E6%8E%A5%E5%88%B0%E6%96%B0%20OU.png)
我正在尝试使用此处找到的资源将现有 OU 链接到新 OU(刚刚创建):http://support.microsoft.com/kb/248392 和这里:http://www.thescriptlibrary.com/default.asp?Action=Display&Level=Category3&ScriptLanguage=VBScript&Category1=Active%20Directory&Category2=OUs&Title=Assign%20a%20New%20Group%20Policy%20Link%20to%20an%20OU,%20revised
问题是,当它执行 .Get("gPLink") 时,它会给出一个错误,提示“在缓存中找不到目录属性”。我相当肯定这是因为目前没有 GPO 链接到 OU,并且它至少需要一个(如果我错了,请纠正我)。
非常感谢您的任何提示和建议!谢谢
答案1
在没有看到你的脚本的情况下,我会说你的假设是合理的。你看到的错误应该出现在脚本中你“获取”“gpLink”属性的那一行。在那一行周围放一些错误捕获,你应该没问题。你链接到的第一个脚本有这样的错误捕获(尽管是在脚本顶部以“On Error Resume Next”的草率形式而不是在错误可能发生的位置有一个好的错误处理程序)。
编辑:
这是您在 Microsoft 上链接到的脚本的“混音”,其中包含一些有关我提到的“.Get”的错误处理。当未指定“gPLink”属性时,“.Get”会导致您看到的错误,因此使用“On Error Goto”捕获它会终止错误。(我真的应该检查返回了什么错误并针对返回的错误采取适当的行动......)
Option Explicit
Dim objiADSToolsDCFunctions, objOU, objGPOs, gPLink, i, gPOChosen
Const DNS_DOMAIN_NAME = "domain.com"
Const OU_DN = "ou=test,dc=domain,dc=com"
Set objiADSToolsDCFunctions = CreateObject("iadstools.dcfunctions")
Set objOU = GetObject("LDAP://" & DNS_DOMAIN_NAME & "/" & OU_DN)
objGPOs = objiADSToolsDCFunctions.GetGPOs("flounderball.gov","home-srv01")
If objGPOs > 0 Then
For i = 1 to objGPOs
WScript.Echo objiADSToolsDCFunctions.gponame(i)
WScript.Echo Chr(9) & objiADSToolsDCFunctions.gpoguid(i)
Next ' i
WScript.Echo "The objOU you will be modifying is:"
WScript.Echo Chr(9) & objOU.adspath
gPOChosen = InputBox("Enter the name of the GPO to add (case insensitive):")
If gPOChosen <> "" Then
For i = 1 to objGPOs
If LCase(objiADSToolsDCFunctions.gPOName(i)) = LCase(gPOChosen) Then
On Error Resume Next
gPLink = objOU.Get("gPLink")
On Error Goto 0
gPLink = gPLink & "[LDAP://CN=" & objiADSToolsDCFunctions.gPOGUID(i) & ",CN=Policies,CN=System," & objiADSToolsDCFunctions.getdefaultnamingcontext(DNS_DOMAIN_NAME) & ";0]"
objOU.Put "gpLink", gpLink
objOU.SetInfo
WScript.Echo "Successfully added a link to this objOU for the GPO (" & objiADSToolsDCFunctions.gponame(i) & ")"
Exit For
End If
Next ' i
End If
End If
答案2
您的错误消息表明该属性未加载到对象的缓存中。那么,您为什么不尝试使用以下命令将其明确添加到对象的缓存中信息获取方法?
在您的行之前objContainer.Get("gPLink")
,输入以下内容:
objContainer.GetInfoEx Array("gPLink"), 0
在我的域环境中这似乎不是必需的。但谁知道你的与我的有何不同。此外,当我针对未附加任何 GPO 的 OU 运行示例脚本时,只会strExistingGPLink
设置为空字符串。