Bianchi928
asked on
Remote username
I need help to modify the following VBScript to collect the remote username as well.
Thanks
Cheers
Dim wmiQuery, objWMIService, objPing, objStatus
Set objShell = CreateObject("WScript.Shel l")
Set objFSO = CreateObject("Scripting.Fi leSystemOb ject")
Const intForReading = 1
Const intForAppending = 8
strPrinterTextFile = objShell.ExpandEnvironment Strings("% USERPROFIL E%") & "\Desktop\NZInputlist.txt"
strIPTextFile = objShell.ExpandEnvironment Strings("% USERPROFIL E%") & "\Desktop\NZOutputlist.txt "
Set objInput = objFSO.OpenTextFile(strPri nterTextFi le, intForReading, False)
Set objOutput = objFSO.OpenTextFile(strIPT extFile, intForAppending, False)
While Not objInput.AtEndOfStream
strcomputer = objInput.ReadLine
Set objWMIService = GetObject("winmgmts:\\.\ro ot\cimv2")
' Set objWMIService = GetObject("winmgmts:{imper sonationle vel=impers onate}!\\" & strComputer & "\root\cimv2")
' Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set objping = objWMIService.ExecQuery("S elect * From Win32_PingStatus Where " & "Address = '" & strComputer & "'")
for each objstatus in objping
If IsNull(objStatus.StatusCod e) Or objStatus.Statuscode <> 0 Then
ResolveIP = strcomputer & " " & "Computer is Unreachable"
Else
ResolveIP = strcomputer & " " & objStatus.ProtocolAddress
End If
objoutput.WriteLine(resolv eip)
next
Wend
objInput.Close
objOutput.Close
wscript.echo "Job Completed"
Thanks
Cheers
Dim wmiQuery, objWMIService, objPing, objStatus
Set objShell = CreateObject("WScript.Shel
Set objFSO = CreateObject("Scripting.Fi
Const intForReading = 1
Const intForAppending = 8
strPrinterTextFile = objShell.ExpandEnvironment
strIPTextFile = objShell.ExpandEnvironment
Set objInput = objFSO.OpenTextFile(strPri
Set objOutput = objFSO.OpenTextFile(strIPT
While Not objInput.AtEndOfStream
strcomputer = objInput.ReadLine
Set objWMIService = GetObject("winmgmts:\\.\ro
' Set objWMIService = GetObject("winmgmts:{imper
' Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set objping = objWMIService.ExecQuery("S
for each objstatus in objping
If IsNull(objStatus.StatusCod
ResolveIP = strcomputer & " " & "Computer is Unreachable"
Else
ResolveIP = strcomputer & " " & objStatus.ProtocolAddress
End If
objoutput.WriteLine(resolv
next
Wend
objInput.Close
objOutput.Close
wscript.echo "Job Completed"
Sorry, to get it from the remote PC you'll need to add the following lines to your script
Set colComputer = objWMIService.ExecQuery ("Select * from Win32_ComputerSystem")
For Each objComputer in colComputer
msgbox ("Logged-on user: " & objComputer.UserName)
Next
Set colComputer = objWMIService.ExecQuery ("Select * from Win32_ComputerSystem")
For Each objComputer in colComputer
msgbox ("Logged-on user: " & objComputer.UserName)
Next
ASKER
Where should I include it in my existing script ? Since I'm writing to an output file, I want it to give me the username for one computer at a time
Hi, I think this should work. I've plugged in Scottyworld's code for you.
Regards,
Rob.
Regards,
Rob.
Dim wmiQuery, objWMIService, objPing, objStatus
Set objShell = CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Const intForReading = 1
Const intForAppending = 8
strPrinterTextFile = objShell.ExpandEnvironmentStrings("%USERPROFILE%") & "\Desktop\NZInputlist.txt"
strIPTextFile = objShell.ExpandEnvironmentStrings("%USERPROFILE%") & "\Desktop\NZOutputlist.txt"
Set objInput = objFSO.OpenTextFile(strPrinterTextFile, intForReading, False)
Set objOutput = objFSO.OpenTextFile(strIPTextFile, intForAppending, False)
While Not objInput.AtEndOfStream
strcomputer = objInput.ReadLine
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
' Set objWMIService = GetObject("winmgmts:{impersonationlevel=impersonate}!\\" & strComputer & "\root\cimv2")
' Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set objping = objWMIService.ExecQuery("Select * From Win32_PingStatus Where " & "Address = '" & strComputer & "'")
for each objstatus in objping
If IsNull(objStatus.StatusCode) Or objStatus.Statuscode <> 0 Then
ResolveIP = strcomputer & " " & "Computer is Unreachable"
Else
ResolveIP = strcomputer & " " & objStatus.ProtocolAddress
End If
Next
Set colComputer = objWMIService.ExecQuery ("Select * from Win32_ComputerSystem")
strUser = ""
For Each objComputer in colComputer
strUser = objComputer.UserName
Next
objoutput.WriteLine resolveip & "," & strUser
Wend
objInput.Close
objOutput.Close
wscript.echo "Job Completed"
ASKER
I tried the above script and it's giving me MY username instead of the remote username.
Cheers
Cheers
Oh, you've got some different objWMIService lines there.
Try this.
Regards,
Rob.
Try this.
Regards,
Rob.
Dim wmiQuery, objWMIService, objPing, objStatus
Set objShell = CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Const intForReading = 1
Const intForAppending = 8
strPrinterTextFile = objShell.ExpandEnvironmentStrings("%USERPROFILE%") & "\Desktop\NZInputlist.txt"
strIPTextFile = objShell.ExpandEnvironmentStrings("%USERPROFILE%") & "\Desktop\NZOutputlist.txt"
Set objInput = objFSO.OpenTextFile(strPrinterTextFile, intForReading, False)
Set objOutput = objFSO.OpenTextFile(strIPTextFile, intForAppending, False)
While Not objInput.AtEndOfStream
strcomputer = objInput.ReadLine
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
' Set objWMIService = GetObject("winmgmts:{impersonationlevel=impersonate}!\\" & strComputer & "\root\cimv2")
' Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set objping = objWMIService.ExecQuery("Select * From Win32_PingStatus Where " & "Address = '" & strComputer & "'")
for each objstatus in objping
If IsNull(objStatus.StatusCode) Or objStatus.Statuscode <> 0 Then
ResolveIP = strcomputer & " " & "Computer is Unreachable"
Else
ResolveIP = strcomputer & " " & objStatus.ProtocolAddress
End If
Next
Set objWMIService = GetObject("winmgmts:{impersonationlevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colComputer = objWMIService.ExecQuery ("Select * from Win32_ComputerSystem")
strUser = ""
For Each objComputer in colComputer
strUser = objComputer.UserName
Next
objoutput.WriteLine resolveip & "," & strUser
Wend
objInput.Close
objOutput.Close
wscript.echo "Job Completed"
ASKER
yep, cheers Rob - I've just noticed that the extra line you put in (23) was commented out higher up, hence why I omitted it the first time!
That means there might be a WMI error on that machine, or it's not contactable. Try this.
Regards,
Rob.
Regards,
Rob.
Dim wmiQuery, objWMIService, objPing, objStatus
Set objShell = CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Const intForReading = 1
Const intForAppending = 8
strPrinterTextFile = objShell.ExpandEnvironmentStrings("%USERPROFILE%") & "\Desktop\NZInputlist.txt"
strIPTextFile = objShell.ExpandEnvironmentStrings("%USERPROFILE%") & "\Desktop\NZOutputlist.txt"
Set objInput = objFSO.OpenTextFile(strPrinterTextFile, intForReading, False)
Set objOutput = objFSO.OpenTextFile(strIPTextFile, intForAppending, False)
While Not objInput.AtEndOfStream
strcomputer = objInput.ReadLine
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
' Set objWMIService = GetObject("winmgmts:{impersonationlevel=impersonate}!\\" & strComputer & "\root\cimv2")
' Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set objping = objWMIService.ExecQuery("Select * From Win32_PingStatus Where " & "Address = '" & strComputer & "'")
for each objstatus in objPing
If IsNull(objStatus.StatusCode) Or objStatus.Statuscode <> 0 Then
ResolveIP = strcomputer & " " & "Computer is Unreachable"
Else
ResolveIP = strcomputer & " " & objStatus.ProtocolAddress
End If
Next
strUser = ""
If InStr(ResolveIP, "Computer is Unreachable") = 0 Then
strResult = TestWMIConnection(strcomputer, 10)
If strResult = "success" Then
Set objWMIService = GetObject("winmgmts:{impersonationlevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colComputer = objWMIService.ExecQuery ("Select * from Win32_ComputerSystem")
For Each objComputer in colComputer
strUser = objComputer.UserName
Next
objoutput.WriteLine resolveip & "," & strUser
ElseIf strResult = "failed" Then
objoutput.WriteLine resolveip & ",wmi failed"
Else
objoutput.WriteLine resolveip & ",wmi time out"
End If
Else
objoutput.WriteLine resolveip & ",unreachable"
End If
Wend
objInput.Close
objOutput.Close
wscript.echo "Job Completed"
Function TestWMIConnection(strComputer, intTimeOutInSeconds)
' Function written by Rob Sampson - 12 Jan 2011
' Experts-Exchange volunteer: http://www.experts-exchange.com/M_3820065.html
' Return strings from this function are in lower case, and consist of:
' "success": WMI Connection successful
' "failed": WMI Connection failed
' "time out": WMI Connection attempt timed out
Set objFSO = CreateObject("Scripting.FileSystemObject")
strTempScript = Replace(WScript.ScriptFullName, WScript.ScriptName, "") & "TempWMITestToBeDeleted.vbs"
Set objTempFile = objFSO.CreateTextFile(strTempScript, True)
objTempFile.WriteLine "On Error Resume Next"
objTempFile.WriteLine "Set objWMIService = GetObject(""winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2"")"
objTempFile.WriteLine "If Err.Number = 0 Then"
objTempFile.WriteLine vbTab & "WScript.StdOut.Write ""Success"""
objTempFile.WriteLine "Else"
objTempFile.WriteLine vbTab & "WScript.StdOut.Write ""Failed"""
objTempFile.WriteLine "End If"
objTempFile.Close
Set objShell = CreateObject("WScript.Shell")
Set objExec = objShell.Exec("wscript " & objFSO.GetFile(strTempScript).ShortPath)
intSeconds = 0
While objExec.Status = 0 And intSeconds <= intTimeOutInSeconds
WScript.Sleep 1000
intSeconds = intSeconds + 1
Wend
If objExec.Status = 1 Then
strReturn = objExec.StdOut.ReadAll
Else
On Error Resume Next
objExec.Terminate
Err.Clear
On Error GoTo 0
strReturn = "Time Out"
End If
objFSO.DeleteFile strTempScript, True
TestWMIConnection = LCase(strReturn)
End Function
Bianchi928
Has the script read a line in the text file that contains a PC that either doesn't exist, or is switched off, or has no-one logged currently logged on?
Has the script read a line in the text file that contains a PC that either doesn't exist, or is switched off, or has no-one logged currently logged on?
ASKER
Something is horribly wrong there....Here's an extract of my output file. It can't be that all those with an IP address have a WMI failed
Cheers
6L28HAVJX9U12RU Failed,wmi failed
ACCOUNTS-01 10.25.2.4,wmi failed
ACCOUNTS02 Failed,wmi failed
AKRTRD1 Failed,wmi failed
AR 10.25.2.94,wmi failed
AR-3 Failed,wmi time out
AREC1 10.25.2.69,wmi failed
AREC2 10.25.2.79,wmi failed
AREC3 10.25.2.72,wmi failed
AREC4 10.25.2.33,wmi failed
AREC5 10.25.2.103,wmi failed
Cheers
6L28HAVJX9U12RU Failed,wmi failed
ACCOUNTS-01 10.25.2.4,wmi failed
ACCOUNTS02 Failed,wmi failed
AKRTRD1 Failed,wmi failed
AR 10.25.2.94,wmi failed
AR-3 Failed,wmi time out
AREC1 10.25.2.69,wmi failed
AREC2 10.25.2.79,wmi failed
AREC3 10.25.2.72,wmi failed
AREC4 10.25.2.33,wmi failed
AREC5 10.25.2.103,wmi failed
are you running the script with an account that has admin rights to the remote PCs ?
e.g. domain admin ?
e.g. domain admin ?
It works fine for me.....perhaps the WMI time out is too short if you have slow links. Try increasing the WMI time out interval:
strResult = TestWMIConnection(strcompu ter, 30)
But yeah, make sure you're running as a domain admin.
If it still has issues, and you know a machine is working, and doesn't have WMI problems, run just this against that machine and see what you get.
Regards,
Rob.
strResult = TestWMIConnection(strcompu
But yeah, make sure you're running as a domain admin.
If it still has issues, and you know a machine is working, and doesn't have WMI problems, run just this against that machine and see what you get.
Set objWMIService = GetObject("winmgmts:{impersonationlevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colComputer = objWMIService.ExecQuery ("Select * from Win32_ComputerSystem")
For Each objComputer in colComputer
msgbox "Logged-on user: " & objComputer.UserName
Next
Regards,
Rob.
If you're going to run Rob's mini-script above then don't forget to define strComputer at line 1, with the computer you want to specifically test/check
strComputer="ACCOUNTS02"
strComputer="ACCOUNTS02"
ASKER
Its definitely an admin rights issue. Where in your last short code can i pass in the domain and password ?
Oh yeah, forgot strComputer...thanks Scotty.....
OK, so to do WMI calls with different credentials, use this.
Regards,
Rob.
OK, so to do WMI calls with different credentials, use this.
Regards,
Rob.
strComputer = "remotepc"
strNamespace = "root\cimv2"
strUser = "domain\user"
strPass = "password"
Const WbemAuthenticationLevelPktPrivacy = 6
Set objWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objWMIService = objwbemLocator.ConnectServer(strComputer, strNamespace, strUser, strPassword)
objWMIService.Security_.authenticationLevel = WbemAuthenticationLevelPktPrivacy
Set colComputer = objWMIService.ExecQuery ("Select * from Win32_ComputerSystem")
For Each objComputer In colComputer
MsgBox "Logged-on user: " & objComputer.UserName
Next
To use that in the full script, try this.
Regards,
Rob.
Regards,
Rob.
strNamespace = "root\cimv2"
strUser = "domain\user"
strPass = "password"
Dim wmiQuery, objWMIService, objPing, objStatus
Const WbemAuthenticationLevelPktPrivacy = 6
Set objShell = CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Const intForReading = 1
Const intForAppending = 8
strPrinterTextFile = objShell.ExpandEnvironmentStrings("%USERPROFILE%") & "\Desktop\NZInputlist.txt"
strIPTextFile = objShell.ExpandEnvironmentStrings("%USERPROFILE%") & "\Desktop\NZOutputlist.txt"
Set objInput = objFSO.OpenTextFile(strPrinterTextFile, intForReading, False)
Set objOutput = objFSO.OpenTextFile(strIPTextFile, intForAppending, False)
While Not objInput.AtEndOfStream
strcomputer = objInput.ReadLine
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
' Set objWMIService = GetObject("winmgmts:{impersonationlevel=impersonate}!\\" & strComputer & "\root\cimv2")
' Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set objping = objWMIService.ExecQuery("Select * From Win32_PingStatus Where " & "Address = '" & strComputer & "'")
for each objstatus in objPing
If IsNull(objStatus.StatusCode) Or objStatus.Statuscode <> 0 Then
ResolveIP = strcomputer & " " & "Computer is Unreachable"
Else
ResolveIP = strcomputer & " " & objStatus.ProtocolAddress
End If
Next
strUser = ""
If InStr(ResolveIP, "Computer is Unreachable") = 0 Then
strResult = TestWMIConnection(strcomputer, 10)
If strResult = "success" Then
'Set objWMIService = GetObject("winmgmts:{impersonationlevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set objWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objWMIService = objwbemLocator.ConnectServer(strComputer, strNamespace, strUser, strPassword)
objWMIService.Security_.authenticationLevel = WbemAuthenticationLevelPktPrivacy
Set colComputer = objWMIService.ExecQuery ("Select * from Win32_ComputerSystem")
For Each objComputer in colComputer
strUser = objComputer.UserName
Next
objoutput.WriteLine resolveip & "," & strUser
ElseIf strResult = "failed" Then
objoutput.WriteLine resolveip & ",wmi failed"
Else
objoutput.WriteLine resolveip & ",wmi time out"
End If
Else
objoutput.WriteLine resolveip & ",unreachable"
End If
Wend
objInput.Close
objOutput.Close
wscript.echo "Job Completed"
Function TestWMIConnection(strComputer, intTimeOutInSeconds)
' Function written by Rob Sampson - 12 Jan 2011
' Experts-Exchange volunteer: http://www.experts-exchange.com/M_3820065.html
' Return strings from this function are in lower case, and consist of:
' "success": WMI Connection successful
' "failed": WMI Connection failed
' "time out": WMI Connection attempt timed out
Set objFSO = CreateObject("Scripting.FileSystemObject")
strTempScript = Replace(WScript.ScriptFullName, WScript.ScriptName, "") & "TempWMITestToBeDeleted.vbs"
Set objTempFile = objFSO.CreateTextFile(strTempScript, True)
objTempFile.WriteLine "On Error Resume Next"
objTempFile.WriteLine "Const WbemAuthenticationLevelPktPrivacy = 6"
objTempFile.WriteLine "Set objWbemLocator = CreateObject(""WbemScripting.SWbemLocator"")"
objTempFile.WriteLine "Set objWMIService = objwbemLocator.ConnectServer(" & strComputer & "," & strNamespace & "," & strUser & "," & strPassword & ")"
objTempFile.WriteLine "objWMIService.Security_.authenticationLevel = WbemAuthenticationLevelPktPrivacy"
objTempFile.WriteLine "If Err.Number = 0 Then"
objTempFile.WriteLine vbTab & "WScript.StdOut.Write ""Success"""
objTempFile.WriteLine "Else"
objTempFile.WriteLine vbTab & "WScript.StdOut.Write ""Failed"""
objTempFile.WriteLine "End If"
objTempFile.Close
Set objShell = CreateObject("WScript.Shell")
Set objExec = objShell.Exec("wscript " & objFSO.GetFile(strTempScript).ShortPath)
intSeconds = 0
While objExec.Status = 0 And intSeconds <= intTimeOutInSeconds
WScript.Sleep 1000
intSeconds = intSeconds + 1
Wend
If objExec.Status = 1 Then
strReturn = objExec.StdOut.ReadAll
Else
On Error Resume Next
objExec.Terminate
Err.Clear
On Error GoTo 0
strReturn = "Time Out"
End If
objFSO.DeleteFile strTempScript, True
TestWMIConnection = LCase(strReturn)
End Function
ASKER
I'm testing and will get back to you Rob
Cheers
Cheers
ASKER
Hi Rob,
The time difference didn't allow me to get back to you ASAP...I'm still having problems. I have done some changes and I will like you to check the coding below and also add the domain/user & password in the code.
Thanks
Cheers
Dim wmiQuery, objWMIService, objPing, objStatus
Set objShell = CreateObject("WScript.Shel l")
Set objFSO = CreateObject("Scripting.Fi leSystemOb ject")
Const intForReading = 1
Const intForAppending = 8
strPrinterTextFile = objShell.ExpandEnvironment Strings("% USERPROFIL E%") & "\Desktop\NZInputlist.txt"
strIPTextFile = objShell.ExpandEnvironment Strings("% USERPROFIL E%") & "\Desktop\NZOutputlist.txt "
Set objInput = objFSO.OpenTextFile(strPri nterTextFi le, intForReading, False)
Set objOutput = objFSO.OpenTextFile(strIPT extFile, intForAppending, False)
While Not objInput.AtEndOfStream
strcomputer = objInput.ReadLine
Set objWMIService = GetObject("winmgmts:\\.\ro ot\cimv2")
Set objping = objWMIService.ExecQuery("S elect * From Win32_PingStatus Where " & "Address = '" & strComputer & "'")
for each objstatus in objping
If IsNull(objStatus.StatusCod e) Or objStatus.Statuscode <> 0 Then
ResolveIP = strcomputer & " " & "Failed"
Else
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colComputer = objWMIService.ExecQuery ("Select * from Win32_ComputerSystem")
strUser = ""
For Each objComputer in colComputer
strUser = objComputer.UserName
Next
ResolveIP = strcomputer & " " & objStatus.ProtocolAddress & " " & struser
End If
objoutput.WriteLine resolveip
Next
Wend
objInput.Close
objOutput.Close
wscript.echo "Job Completed"
The time difference didn't allow me to get back to you ASAP...I'm still having problems. I have done some changes and I will like you to check the coding below and also add the domain/user & password in the code.
Thanks
Cheers
Dim wmiQuery, objWMIService, objPing, objStatus
Set objShell = CreateObject("WScript.Shel
Set objFSO = CreateObject("Scripting.Fi
Const intForReading = 1
Const intForAppending = 8
strPrinterTextFile = objShell.ExpandEnvironment
strIPTextFile = objShell.ExpandEnvironment
Set objInput = objFSO.OpenTextFile(strPri
Set objOutput = objFSO.OpenTextFile(strIPT
While Not objInput.AtEndOfStream
strcomputer = objInput.ReadLine
Set objWMIService = GetObject("winmgmts:\\.\ro
Set objping = objWMIService.ExecQuery("S
for each objstatus in objping
If IsNull(objStatus.StatusCod
ResolveIP = strcomputer & " " & "Failed"
Else
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colComputer = objWMIService.ExecQuery ("Select * from Win32_ComputerSystem")
strUser = ""
For Each objComputer in colComputer
strUser = objComputer.UserName
Next
ResolveIP = strcomputer & " " & objStatus.ProtocolAddress & " " & struser
End If
objoutput.WriteLine resolveip
Next
Wend
objInput.Close
objOutput.Close
wscript.echo "Job Completed"
The code still works for me, and I have changed the output to CSV. See what this gives you.
Regards,
Rob.
Regards,
Rob.
Dim wmiQuery, objWMIService, objPing, objStatus
Set objShell = CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Const intForReading = 1
Const intForAppending = 8
strPrinterTextFile = objShell.ExpandEnvironmentStrings("%USERPROFILE%") & "\Desktop\NZInputlist.txt"
strIPTextFile = objShell.ExpandEnvironmentStrings("%USERPROFILE%") & "\Desktop\NZOutputlist.csv"
Set objInput = objFSO.OpenTextFile(strPrinterTextFile, intForReading, False)
Set objOutput = objFSO.OpenTextFile(strIPTextFile, intForAppending, True)
While Not objInput.AtEndOfStream
strcomputer = objInput.ReadLine
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set objping = objWMIService.ExecQuery("Select * From Win32_PingStatus Where " & "Address = '" & strComputer & "'")
For Each objstatus In objping
If IsNull(objStatus.StatusCode) Or objStatus.Statuscode <> 0 Then
objOutput.WriteLine strcomputer & ",offline"
Else
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colComputer = objWMIService.ExecQuery ("Select * from Win32_ComputerSystem")
strUser = ""
For Each objComputer in colComputer
strUser = objComputer.UserName
Next
objoutput.WriteLine strcomputer & "," & objStatus.ProtocolAddress & "," & struser
End If
Next
Wend
objInput.Close
objOutput.Close
wscript.echo "Job Completed"
ASKER
It comes up with the attached error message. I'm having lots of problems with permissions.
Will you be able hard code the domain/user & password etc in the code. I'm sure it will work then
Somethig like that
strUser = "domain\user"
strPass = "password"
Thanks
Cheers
error1.bmp
Will you be able hard code the domain/user & password etc in the code. I'm sure it will work then
Somethig like that
strUser = "domain\user"
strPass = "password"
Thanks
Cheers
error1.bmp
Oh sorry, I didn't realise you didn't have the alternate credentials in the latest script you posted. Try this.
Regards,
Rob.
Regards,
Rob.
strUser = "domain\administrator"
strPassword = "password"
Const WbemAuthenticationLevelPktPrivacy = 6
Dim wmiQuery, objWMIService, objPing, objStatus
Set objShell = CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Const intForReading = 1
Const intForAppending = 8
strPrinterTextFile = objShell.ExpandEnvironmentStrings("%USERPROFILE%") & "\Desktop\NZInputlist.txt"
strIPTextFile = objShell.ExpandEnvironmentStrings("%USERPROFILE%") & "\Desktop\NZOutputlist.csv"
Set objInput = objFSO.OpenTextFile(strPrinterTextFile, intForReading, False)
Set objOutput = objFSO.OpenTextFile(strIPTextFile, intForAppending, True)
While Not objInput.AtEndOfStream
strcomputer = objInput.ReadLine
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set objping = objWMIService.ExecQuery("Select * From Win32_PingStatus Where " & "Address = '" & strComputer & "'")
For Each objstatus In objPing
If IsNull(objStatus.StatusCode) Or objStatus.Statuscode <> 0 Then
objOutput.WriteLine strcomputer & ",offline"
Else
Set objWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objWMIService = objwbemLocator.ConnectServer(strComputer, "root\cimv2", strUser, strPassword)
objWMIService.Security_.authenticationLevel = WbemAuthenticationLevelPktPrivacy
Set colComputer = objWMIService.ExecQuery ("Select * from Win32_ComputerSystem")
strUser = ""
For Each objComputer in colComputer
strUser = objComputer.UserName
Next
objoutput.WriteLine strcomputer & "," & objStatus.ProtocolAddress & "," & struser
End If
Next
Wend
objInput.Close
objOutput.Close
wscript.echo "Job Completed"
Nice one Rob! Works fine for me too now.
Can you just confirm for me.... in your script on 08/03/11 04:10 AM, ID: 35065314
Surely line 28 stops the credentials being passed though? - I assume you had that in there for local testing?
Not criticising, just trying to learn WMI credential passing!
Can you just confirm for me.... in your script on 08/03/11 04:10 AM, ID: 35065314
Surely line 28 stops the credentials being passed though? - I assume you had that in there for local testing?
Not criticising, just trying to learn WMI credential passing!
Oh your right!!! strUser is reassigned for each computer that is checked. This is fixed by user strUsername as the credentials passed.
Regards,
Rob.
Regards,
Rob.
strUsername = "domain\administrator"
strPassword = "password"
Const WbemAuthenticationLevelPktPrivacy = 6
Dim wmiQuery, objWMIService, objPing, objStatus
Set objShell = CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Const intForReading = 1
Const intForAppending = 8
strPrinterTextFile = objShell.ExpandEnvironmentStrings("%USERPROFILE%") & "\Desktop\NZInputlist.txt"
strIPTextFile = objShell.ExpandEnvironmentStrings("%USERPROFILE%") & "\Desktop\NZOutputlist.csv"
Set objInput = objFSO.OpenTextFile(strPrinterTextFile, intForReading, False)
Set objOutput = objFSO.OpenTextFile(strIPTextFile, intForAppending, True)
While Not objInput.AtEndOfStream
strcomputer = objInput.ReadLine
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set objping = objWMIService.ExecQuery("Select * From Win32_PingStatus Where " & "Address = '" & strComputer & "'")
For Each objstatus In objPing
If IsNull(objStatus.StatusCode) Or objStatus.Statuscode <> 0 Then
objOutput.WriteLine strcomputer & ",offline"
Else
Set objWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objWMIService = objwbemLocator.ConnectServer(strComputer, "root\cimv2", strUsername, strPassword)
objWMIService.Security_.authenticationLevel = WbemAuthenticationLevelPktPrivacy
Set colComputer = objWMIService.ExecQuery ("Select * from Win32_ComputerSystem")
strUser = ""
For Each objComputer in colComputer
strUser = objComputer.UserName
Next
objoutput.WriteLine strcomputer & "," & objStatus.ProtocolAddress & "," & struser
End If
Next
Wend
objInput.Close
objOutput.Close
wscript.echo "Job Completed"
ASKER
That is a WMI problem. I'll have to add the WMI check back in....
ASKER
I forgot to mention that while testing on 5 computer in the input file..it failed on the last one and created a csv file for the succesful ones. Maybe you could get the code to carry on for those computer whose RPC server is unavailable. I will be happy with just that
Try this.
Regards,
Rob.
Regards,
Rob.
strUsername = "domain\administrator"
strPassword = "password"
Const WbemAuthenticationLevelPktPrivacy = 6
Dim wmiQuery, objWMIService, objPing, objStatus
Set objShell = CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Const intForReading = 1
Const intForAppending = 8
strPrinterTextFile = objShell.ExpandEnvironmentStrings("%USERPROFILE%") & "\Desktop\NZInputlist.txt"
strIPTextFile = objShell.ExpandEnvironmentStrings("%USERPROFILE%") & "\Desktop\NZOutputlist.csv"
Set objInput = objFSO.OpenTextFile(strPrinterTextFile, intForReading, False)
Set objOutput = objFSO.OpenTextFile(strIPTextFile, intForAppending, True)
While Not objInput.AtEndOfStream
strcomputer = objInput.ReadLine
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set objping = objWMIService.ExecQuery("Select * From Win32_PingStatus Where " & "Address = '" & strComputer & "'")
For Each objstatus In objPing
If IsNull(objStatus.StatusCode) Or objStatus.Statuscode <> 0 Then
objOutput.WriteLine strcomputer & ",offline"
Else
strResult = TestWMIConnection(strcomputer, 30)
If strResult = "success" Then
Set objWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objWMIService = objwbemLocator.ConnectServer(strComputer, "root\cimv2", strUsername, strPassword)
objWMIService.Security_.authenticationLevel = WbemAuthenticationLevelPktPrivacy
Set colComputer = objWMIService.ExecQuery ("Select * from Win32_ComputerSystem")
strUser = ""
For Each objComputer in colComputer
strUser = objComputer.UserName
Next
objoutput.WriteLine strcomputer & "," & objStatus.ProtocolAddress & "," & strUser
ElseIf strResult = "failed" Then
objoutput.WriteLine strcomputer & "," & objStatus.ProtocolAddress & ",wmi error"
Else
objoutput.WriteLine strcomputer & "," & objStatus.ProtocolAddress & ",wmi time out"
End If
End If
Next
Wend
objInput.Close
objOutput.Close
wscript.echo "Job Completed"
Function TestWMIConnection(strComputer, intTimeOutInSeconds)
' Function written by Rob Sampson - 12 Jan 2011
' Experts-Exchange volunteer: http://www.experts-exchange.com/M_3820065.html
' Return strings from this function are in lower case, and consist of:
' "success": WMI Connection successful
' "failed": WMI Connection failed
' "time out": WMI Connection attempt timed out
Set objFSO = CreateObject("Scripting.FileSystemObject")
strTempScript = Replace(WScript.ScriptFullName, WScript.ScriptName, "") & "TempWMITestToBeDeleted.vbs"
Set objTempFile = objFSO.CreateTextFile(strTempScript, True)
objTempFile.WriteLine "On Error Resume Next"
objTempFile.WriteLine "Const WbemAuthenticationLevelPktPrivacy = 6"
objTempFile.WriteLine "Set objWbemLocator = CreateObject(""WbemScripting.SWbemLocator"")"
objTempFile.WriteLine "Set objWMIService = objwbemLocator.ConnectServer(" & strComputer & "," & strNamespace & "," & strUser & "," & strPassword & ")"
objTempFile.WriteLine "objWMIService.Security_.authenticationLevel = WbemAuthenticationLevelPktPrivacy"
objTempFile.WriteLine "If Err.Number = 0 Then"
objTempFile.WriteLine vbTab & "WScript.StdOut.Write ""Success"""
objTempFile.WriteLine "Else"
objTempFile.WriteLine vbTab & "WScript.StdOut.Write ""Failed"""
objTempFile.WriteLine "End If"
objTempFile.Close
Set objShell = CreateObject("WScript.Shell")
Set objExec = objShell.Exec("wscript " & objFSO.GetFile(strTempScript).ShortPath)
intSeconds = 0
While objExec.Status = 0 And intSeconds <= intTimeOutInSeconds
WScript.Sleep 1000
intSeconds = intSeconds + 1
Wend
If objExec.Status = 1 Then
strReturn = objExec.StdOut.ReadAll
Else
On Error Resume Next
objExec.Terminate
Err.Clear
On Error GoTo 0
strReturn = "Time Out"
End If
objFSO.DeleteFile strTempScript, True
TestWMIConnection = LCase(strReturn)
End Function
ASKER
Okay..Let's see
When I run 35075601, The result is in NZOutput1.csv attached file
When I run 35076521, The result is in NZOutput2.csv attached file
The WMI error doesn't seem right.
If it's going to be time consuming for you, I'm quite happy to go with 35075601. It would be good if you add a code to skip the RPC error and carry on with the next computer from the input file.
Thanks
Cheers
NZOutput1.csv
NZOutput2.csv
When I run 35075601, The result is in NZOutput1.csv attached file
When I run 35076521, The result is in NZOutput2.csv attached file
The WMI error doesn't seem right.
If it's going to be time consuming for you, I'm quite happy to go with 35075601. It would be good if you add a code to skip the RPC error and carry on with the next computer from the input file.
Thanks
Cheers
NZOutput1.csv
NZOutput2.csv
Crap. Forgot to change one line in the latest code....can you please double check this one? If it still doesn't work, I'll change the error checking.
Rob.
Rob.
strUsername = "domain\administrator"
strPassword = "password"
Const WbemAuthenticationLevelPktPrivacy = 6
Dim wmiQuery, objWMIService, objPing, objStatus
Set objShell = CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Const intForReading = 1
Const intForAppending = 8
strPrinterTextFile = objShell.ExpandEnvironmentStrings("%USERPROFILE%") & "\Desktop\NZInputlist.txt"
strIPTextFile = objShell.ExpandEnvironmentStrings("%USERPROFILE%") & "\Desktop\NZOutputlist.csv"
Set objInput = objFSO.OpenTextFile(strPrinterTextFile, intForReading, False)
Set objOutput = objFSO.OpenTextFile(strIPTextFile, intForAppending, True)
While Not objInput.AtEndOfStream
strcomputer = objInput.ReadLine
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set objping = objWMIService.ExecQuery("Select * From Win32_PingStatus Where " & "Address = '" & strComputer & "'")
For Each objstatus In objPing
If IsNull(objStatus.StatusCode) Or objStatus.Statuscode <> 0 Then
objOutput.WriteLine strcomputer & ",offline"
Else
strResult = TestWMIConnection(strcomputer, 30)
If strResult = "success" Then
Set objWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objWMIService = objwbemLocator.ConnectServer(strComputer, "root\cimv2", strUsername, strPassword)
objWMIService.Security_.authenticationLevel = WbemAuthenticationLevelPktPrivacy
Set colComputer = objWMIService.ExecQuery ("Select * from Win32_ComputerSystem")
strUser = ""
For Each objComputer in colComputer
strUser = objComputer.UserName
Next
objoutput.WriteLine strcomputer & "," & objStatus.ProtocolAddress & "," & strUser
ElseIf strResult = "failed" Then
objoutput.WriteLine strcomputer & "," & objStatus.ProtocolAddress & ",wmi error"
Else
objoutput.WriteLine strcomputer & "," & objStatus.ProtocolAddress & ",wmi time out"
End If
End If
Next
Wend
objInput.Close
objOutput.Close
wscript.echo "Job Completed"
Function TestWMIConnection(strComputer, intTimeOutInSeconds)
' Function written by Rob Sampson - 12 Jan 2011
' Experts-Exchange volunteer: http://www.experts-exchange.com/M_3820065.html
' Return strings from this function are in lower case, and consist of:
' "success": WMI Connection successful
' "failed": WMI Connection failed
' "time out": WMI Connection attempt timed out
Set objFSO = CreateObject("Scripting.FileSystemObject")
strTempScript = Replace(WScript.ScriptFullName, WScript.ScriptName, "") & "TempWMITestToBeDeleted.vbs"
Set objTempFile = objFSO.CreateTextFile(strTempScript, True)
objTempFile.WriteLine "On Error Resume Next"
objTempFile.WriteLine "Const WbemAuthenticationLevelPktPrivacy = 6"
objTempFile.WriteLine "Set objWbemLocator = CreateObject(""WbemScripting.SWbemLocator"")"
objTempFile.WriteLine "Set objWMIService = objwbemLocator.ConnectServer(" & strComputer & "," & strNamespace & "," & strUserName & "," & strPassword & ")"
objTempFile.WriteLine "objWMIService.Security_.authenticationLevel = WbemAuthenticationLevelPktPrivacy"
objTempFile.WriteLine "If Err.Number = 0 Then"
objTempFile.WriteLine vbTab & "WScript.StdOut.Write ""Success"""
objTempFile.WriteLine "Else"
objTempFile.WriteLine vbTab & "WScript.StdOut.Write ""Failed"""
objTempFile.WriteLine "End If"
objTempFile.Close
Set objShell = CreateObject("WScript.Shell")
Set objExec = objShell.Exec("wscript " & objFSO.GetFile(strTempScript).ShortPath)
intSeconds = 0
While objExec.Status = 0 And intSeconds <= intTimeOutInSeconds
WScript.Sleep 1000
intSeconds = intSeconds + 1
Wend
If objExec.Status = 1 Then
strReturn = objExec.StdOut.ReadAll
Else
On Error Resume Next
objExec.Terminate
Err.Clear
On Error GoTo 0
strReturn = "Time Out"
End If
objFSO.DeleteFile strTempScript, True
TestWMIConnection = LCase(strReturn)
End Function
ASKER
It's still showing these WMI error when it shouldn't. Let go with 35075601, just add the error ckecking code for RPC failure.
Thanks
Cheers
Thanks
Cheers
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Thanks so much for your help. All Good !!
Cheers
Cheers
Dim objNetwork
Set objNetwork = CreateObject("WScript.Netw
MsgBox objNetwork.UserName