Vbscript AD查询“远程服务器不存在或不可用”

Vbscript AD查询“远程服务器不存在或不可用”,vbscript,active-directory,Vbscript,Active Directory,好主意。我根据你的建议修改了剧本。然而,它还有另一个问题。新脚本仅返回计算机OU中的最后一台计算机。如何正确地将每个实例从字典传递到If语句 dim strComputer, objFileToWrite, objWMIService If Reachable(QueryAD) Then Set objFileToWrite = CreateObject("Scripting.FileSystemObject").OpenTextFile("\\cheeng.net\winc\IT\N

好主意。我根据你的建议修改了剧本。然而,它还有另一个问题。新脚本仅返回计算机OU中的最后一台计算机。如何正确地将每个实例从字典传递到If语句

 dim strComputer, objFileToWrite, objWMIService

 If Reachable(QueryAD) Then

Set objFileToWrite =  CreateObject("Scripting.FileSystemObject").OpenTextFile("\\cheeng.net\winc\IT\NuanceKey.txt",8,true)

Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & QueryAD & "\root\cimv2")
Set colComputer = objWMIService.ExecQuery _
("Select * from Win32_ComputerSystem")
For Each objComputer in colComputer
    objFileToWrite.Write VBNewLine & "User Name = " & objComputer.UserName _
        & VBNewLine & "Computer Name = " & objComputer.Name
Next  
WScript.Echo  QueryAD & " Computer is Reachable!"
Else 
WScript.Echo QueryAD & "Computer is Unreachable!"
 End If



Function QueryAD

Dim objDictionary, strItem, colItems, i, s
Set objDictionary = CreateObject("Scripting.Dictionary")
Set objOU = GetObject("LDAP://OU=Computers,OU=WINC,DC=cheeng,DC=net")
objOU.Filter = Array("Computer")

For Each objComputer in objOU    ' Add Workstations to Dictionary
    objDictionary.Add a, objComputer.CN
    a = a + 1 
colItems = objDictionary.Items  ' Get the workstations.

for i = 0 to objDictionary.count -1 ' Iterate the array.
    s = colItems(i) ' Create return string.

next
QueryAD = s

Next
End Function 


Function Reachable(strComputer) 'Test Connectivty to computer
Dim wmiQuery, objWMIService, objStatus

' Define the WMI query
wmiQuery = "Select * From Win32_PingStatus Where Address = '" & strComputer & "'"

' Run the WMI query
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2").ExecQuery(wmiQuery)

' Translate the query results to either True or False
For Each objStatus in objWMIService
If IsNull(objStatus.StatusCode) Or objStatus.Statuscode<>0 Then
    Reachable = False 'if computer is unreachable, return false
Else
    Reachable = True 'if computer is reachable, return true
End If
Next

Set objWMIService = Nothing
End Function

在连接到远程计算机之前,您需要ping它以查看它是否联机。这里有一个函数可以做到这一点

Function Reachable(strComputer) 'Test Connectivty to computer
Dim wmiQuery, objWMIService, objPing, objStatus
wmiQuery = "Select * From Win32_PingStatus Where Address = '" & strComputer & "'"
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set objPing = objWMIService.ExecQuery(wmiQuery)
For Each objStatus in objPing
    If IsNull(objStatus.StatusCode) Or objStatus.Statuscode<>0 Then
        Reachable = False 'if computer is unreachable, return false
    Else
        Reachable = True 'if computer is reachable, return true
    End If
Next
End Function
编辑:

您需要在For循环中添加可访问函数,并一次向该函数发送一台计算机

您可能还希望仅查询处于活动状态的计算机的AD。例如:

Set objFileToWrite =  CreateObject("Scripting.FileSystemObject").OpenTextFile("\\cheeng.net\winc\IT\NuanceKey.txt",8,true)

arrComps = QueryAD

For Each strComputer in arrComps

If Reachable(strComputer) Then 
    Wscript.Echo strComputer & " Computer is Reachable!"
    Set objWMIService = GetObject("winmgmts:" _
        & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    Set colComputer = objWMIService.ExecQuery _
        ("Select * from Win32_ComputerSystem")
    For Each objComputer in colComputer
        objFileToWrite.Write VBNewLine & "User Name = " & objComputer.UserName _
        & VBNewLine & "Computer Name = " & objComputer.Name
        'You could also use strComputer here instead of objComputer.Name
Else 'If not reachable
    Wscript.Echo strComputer & " Computer is Unreachable!"
End If 'End Reachable If

Next  'Loop to next computer

Function QueryAD
    Const ADS_SCOPE_SUBTREE = 2
    Dim objDictionary, colItems, strComputer
    Set objDictionary = CreateObject("Scripting.Dictionary")

    Set objRootDSE = GetObject("LDAP://RootDSE")
    strDomain = objRootDSE.Get("DefaultNamingContext")

    Set objConnection = CreateObject("ADODB.Connection")
    Set objCommand =   CreateObject("ADODB.Command")
    objConnection.Provider = "ADsDSOObject"
    objConnection.Open "Active Directory Provider"

    Set objCOmmand.ActiveConnection = objConnection
    objCommand.CommandText = _
        "Select Name from 'LDAP://" & strDomain & "' " _
        & "Where objectClass='computer' and userAccountControl <> 4098 and userAccountControl <> 4130"
    'This will get all computers except disabled computers from AD
    objCommand.Properties("Page Size") = 1000
    objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE 
    Set objRecordSet = objCommand.Execute
    objRecordSet.MoveFirst

    Do Until objRecordSet.EOF
        strComputer = objRecordSet.Fields("Name").Value
        objDictionary.Add strComputer,strComputer
        objRecordSet.MoveNext
    Loop
    objRecordSet.Close
    QueryAD = objDictionary.Items
End Function 

Function Reachable(strComputer) 'Test Connectivty to computer
    'keep the same as you had it
End Function

好主意。我根据你的建议修改了剧本。然而,它还有另一个问题。新脚本仅返回计算机OU中的最后一台计算机。如何正确地将每个实例从字典传递到If语句?在函数中设置s=colItemsi,它将在每个循环中重置s,在最后一个循环中,s将=最后一项。如果要返回数组,只需设置array=objDictionary.Items。我更新了代码来帮助你。你帮了我很大的忙。谢谢我正在学习如何做到这一点。我工作的公司是一家有三个姐妹的儿童公司。在active directory中有成千上万个我不关心的工作站。有没有办法在这个新功能中指定一个特定的文件夹?strOU=OU=Computers,OU=WINC,从“LDAP://&strOU&strDomain&”中选择名称。。。
Set objFileToWrite =  CreateObject("Scripting.FileSystemObject").OpenTextFile("\\cheeng.net\winc\IT\NuanceKey.txt",8,true)

arrComps = QueryAD

For Each strComputer in arrComps

If Reachable(strComputer) Then 
    Wscript.Echo strComputer & " Computer is Reachable!"
    Set objWMIService = GetObject("winmgmts:" _
        & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
    Set colComputer = objWMIService.ExecQuery _
        ("Select * from Win32_ComputerSystem")
    For Each objComputer in colComputer
        objFileToWrite.Write VBNewLine & "User Name = " & objComputer.UserName _
        & VBNewLine & "Computer Name = " & objComputer.Name
        'You could also use strComputer here instead of objComputer.Name
Else 'If not reachable
    Wscript.Echo strComputer & " Computer is Unreachable!"
End If 'End Reachable If

Next  'Loop to next computer

Function QueryAD
    Const ADS_SCOPE_SUBTREE = 2
    Dim objDictionary, colItems, strComputer
    Set objDictionary = CreateObject("Scripting.Dictionary")

    Set objRootDSE = GetObject("LDAP://RootDSE")
    strDomain = objRootDSE.Get("DefaultNamingContext")

    Set objConnection = CreateObject("ADODB.Connection")
    Set objCommand =   CreateObject("ADODB.Command")
    objConnection.Provider = "ADsDSOObject"
    objConnection.Open "Active Directory Provider"

    Set objCOmmand.ActiveConnection = objConnection
    objCommand.CommandText = _
        "Select Name from 'LDAP://" & strDomain & "' " _
        & "Where objectClass='computer' and userAccountControl <> 4098 and userAccountControl <> 4130"
    'This will get all computers except disabled computers from AD
    objCommand.Properties("Page Size") = 1000
    objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE 
    Set objRecordSet = objCommand.Execute
    objRecordSet.MoveFirst

    Do Until objRecordSet.EOF
        strComputer = objRecordSet.Fields("Name").Value
        objDictionary.Add strComputer,strComputer
        objRecordSet.MoveNext
    Loop
    objRecordSet.Close
    QueryAD = objDictionary.Items
End Function 

Function Reachable(strComputer) 'Test Connectivty to computer
    'keep the same as you had it
End Function