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

时间:2013-10-07 11:47:28

标签: vbscript active-directory

多么棒的主意。我根据你的建议重新编写了脚本。然而它有另一个问题。新脚本仅返回计算机OU中的最后一台计算机。如何正确地将每个实例从Dictionary传递到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

1 个答案:

答案 0 :(得分:1)

在连接到远程计算机之前,您需要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

然后要使用此功能,您可以执行

If Reachable("computername") Then
    Set objWMIService = GetObject...etc

修改

您需要在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