dersven2
Goto Top

AD - auslesen nach OS, Computer, Lastlogon, Ping - VB Script

//edit hier die funktionierende Version - kein Grund die unteren Konversation durchzugehen.

Das Skript liest euch Active Directory aus nach folgenden Kriterien:

Computerobjekte - die mit OS Windows XP laufen, erstellt ein .txt File und schreibt euch folgendes rein:

Computername, OS, Last Logontime und ein Ping auf jedes Objekt (wobei eine Antwort 0= Online und 11004=Offline bedeutet)

Hoffe das hilft !

Lg. S


' Skript to check Active Directory for : Operating System, object=Computer, ping each Comp.object and create a .txt report   
' march 2012  
' intressting = Replace function !! (see line 36)  




'on error resume next  

strComputer = "."  
Set objOU = GetObject ("LDAP://OU=XXXXXXXXXX,DC=XXX,DC=XXX")  
Set objFSO = CreateObject("Scripting.FileSystemObject")  
Set objTextFile = objFSO.CreateTextFile ("\\Networkpath\users\XXX\Desktop\Logfile.txt", ForAppending = 8)  

	for each objMember in objOU

		if objMember.Class = "computer" and objMember.operatingSystem = "Windows XP Professional" then  

			set objLastLogon = objMember.Get("lastLogonTimestamp")  
			i8High = objLastLogon.HighPart
			i8Low = objLastLogon.LowPart 

				If (i8Low < 0) Then
				i8High = i8High + 1
			End If

				intLastLogonTime = i8High  * (2^32) + i8Low 
				intLastLogonTime = intLastLogonTime / (60 * 10000000)
				intLastLogonTime = intLastLogonTime / 1440

	
				Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")  
				Set colPings = objWMIService.ExecQuery("Select * From Win32_PingStatus where Address ='"& Replace(objMember.sAMAccountName, "$", "") & "'")  
				
				For Each objItem In colPings
				onlStatus = objItem.PrimaryAddressResolutionStatus 

				Next
				
			objTextFile.WriteLine("PC Name:  " & Replace(objMember.sAMAccountName, "$", "") & " , Operating System :" & objMember.operatingSystem & " , Last logontime : " & intLastLogonTime + #1/1/1601# & "  Onlinestatus : " & onlstatus)  

		end if
		
		next
objTextFile.Close

set objOU = nothing
set objMember = nothing
set objLastLogon = nothing
set objWMIService = nothing

wscript.quit

[Edit Biber] Codeformatierung [/Edit]

Content-Key: 182619

Url: https://administrator.de/contentid/182619

Ausgedruckt am: 19.03.2024 um 04:03 Uhr

Mitglied: bastla
bastla 26.03.2012 um 20:03:08 Uhr
Goto Top
Hallo DerSven2 und willkommen im Forum!

Versuch es mal so:
Set colPings = objWMIService.ExecQuery("Select * From Win32_PingStatus where Address ='"& objMember.name & "'")
Grüße
bastla
Mitglied: DerSven2
DerSven2 28.03.2012 um 17:07:58 Uhr
Goto Top
Hallo
Danke dir auf alle Faelle fuer die Antowort!

Das habe ich auch versucht - ich bleibe dann auf den folgenden 3 Zeilen haengen mit: " Object doesn't support this property or method: 'colPings.PrimaryAddressResolutionStatus'


' on error resume next

strComputer = "."
Set objOU = GetObject ("LDAP://OU=Desktops,OU=Systems,OU=xx,DC=ca")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.CreateTextFile ("\\rinas1p2\users\xxxs\Desktop\x\XXX.txt", ForAppending = 8)

for each objMember in objOU

if objMember.Class = "computer" and objMember.operatingSystem = "Windows XP Professional" then

set objLastLogon = objMember.Get("lastLogonTimestamp")
i8High = objLastLogon.HighPart
i8Low = objLastLogon.LowPart

If (i8Low < 0) Then
i8High = i8High + 1
End If

intLastLogonTime = i8High * (2^32) + i8Low
intLastLogonTime = intLastLogonTime / (60 * 10000000)
intLastLogonTime = intLastLogonTime / 1440


Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colPings = objWMIService.ExecQuery("Select * From Win32_PingStatus where Address ='"& objMember.name & "'")
Set onlStatus = colpings.PrimaryAddressResolutionStatus
objTextFile.WriteLine("PC Name: " & objMember.Name & " , Operating System :" & objMember.operatingSystem & " , " & intLastLogonTime + #1/1/1601# & "Onlinestatus : " & onlstatus)

end if
objTextFile.Close

set objOU = nothing
set objMember = nothing
set objLastLogon = nothing
set objWMIService = nothing

next
wscript.quit
Mitglied: bastla
bastla 28.03.2012 um 17:16:16 Uhr
Goto Top
Hallo DerSven2!

Vorweg: Findest Du nicht, dass Dein (von Biber für Dich formatierter) Code im Eröffnungsposting viel leserlicher ist? Die entsprechende Formatierung geht auch gar nicht so schwer ( ) und lässt sich auch nachträglich noch einbauen ...
Ich würde einfach
onlStatus = colPings.StatusCode
verwenden, auf jeden Fall aber das "Set" weglassen ...

Grüße
bastla
Mitglied: DerSven2
DerSven2 28.03.2012 um 17:23:29 Uhr
Goto Top
edit - die Einrueckungen werden nicht uebernommen.
edit 2 - hab rausgefunden wie das funktioniert auf dem Board
//edit 3 - irgendwie funktioniert die formatierung leider nicht ganz wie ich mir das vorstelle - sorry !


gesagt getan! (wenn du das mit einruecken meintest?)

Fehler bleibt leider der gleiche (object doesnt support (...) 'colping.StatusCode')


' on error resume next  

strComputer = "."  
Set objOU = GetObject ("LDAP://OU=Desktops,OU=Systems,OU=XXX,DC=ca")  
Set objFSO = CreateObject("Scripting.FileSystemObject")  
Set objTextFile = objFSO.CreateTextFile ("\\rinas1p2\users\XXXs\Desktop\x\XXX.txt", ForAppending = 8)  

for each objMember in objOU

	if objMember.Class = "computer" and objMember.operatingSystem = "Windows XP Professional" then  

		set objLastLogon = objMember.Get("lastLogonTimestamp")  
		i8High = objLastLogon.HighPart
		i8Low = objLastLogon.LowPart 

			If (i8Low < 0) Then
			i8High = i8High + 1
		End If

			intLastLogonTime = i8High  * (2^32) + i8Low 
			intLastLogonTime = intLastLogonTime / (60 * 10000000)
			intLastLogonTime = intLastLogonTime / 1440

	
		Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")  
		Set colPings = objWMIService.ExecQuery("Select * From Win32_PingStatus where Address ='"& objMember.name & "'")  
		onlStatus = colpings.StatusCode
		objTextFile.WriteLine("PC Name:  " & objMember.Name & " , Operating System :" & objMember.operatingSystem & " , " & intLastLogonTime + #1/1/1601# & "Onlinestatus : " & onlstatus)  

	end if
objTextFile.Close

set objOU = nothing
set objMember = nothing
set objLastLogon = nothing
set objWMIService = nothing

next
wscript.quit
Mitglied: bastla
bastla 28.03.2012 um 17:53:26 Uhr
Goto Top
Hallo DerSven2!

Neuer Versuch face-wink:
For Each objItem In colPings
    onlStatus = objItem.PrimaryAddressResolutionStatus
Next
Grüße
bastla
Mitglied: DerSven2
DerSven2 28.03.2012 um 19:00:20 Uhr
Goto Top
Das sieht schon verdamt gut aus !
Einziger Wodkatropfen: er schreibt eine Zeile komplett korrekt !!! (mit aktuellem Pingstatus 0= online 11004= not reachable), nach der ersten Zeile wirft er dann allerdigs ein:

Line 28 char.4 : Object variable not set

aus.

\\ein Ding habe ich gerdae noch gefunden, die Ausgabe ist in CN="PCname" und ein Ping auf ein "CN=Pcname" klappt natuerlich nie da die PCs eben nicht CN=xyz benannt sind. Das muss ich noch umbauen.
Mitglied: bastla
bastla 28.03.2012 um 19:32:39 Uhr
Goto Top
Hallo DerSven2!
Line 28 char.4 : Object variable not set
Die Zeile 31 muss nach dem "Next" platziert werden, und die Zeilen 33 bis 36 kannst Du weglassen (oder zumindest ebenfalls aus der Schleife raus nach unten verschieben) ...
die Ausgabe ist in CN="PCname"
Dann wäre wohl
objMember.sAMAccountName
besser ...

Grüße
bastla
Mitglied: DerSven2
DerSven2 28.03.2012 um 21:18:21 Uhr
Goto Top
ich habe keine Ahnung woher du siehst in welche Zeile ein "next" gehoert - aber es funktioniert !

das letzte, letzte Ding ist nur noch das ich als Pingantwort fuer jedes einzelen Computerobject "11004"(offline) bekomme, welches nicht richtig ist da viele Online sind. "gruebel"


//edit - wenn ich in "PCName :" & objMember.sAMAccountName .... aendere bekomme ich als Antwort:

PC Name: DUOCOM1$ , Operating System :Windows XP Professional , 22.03.2012 02:06:51Onlinestatus : 11004
PC Name: DUOCOM2$ usw.usw.usw
daher gehen die Pings auch nicht da am "ADObjektnamen" nun ein $ irgendwoher kommt. Ich versuche mal rauszubekommen woher die kommen.

Auch und gleich noch mal 100 danke an dich , einfach fuer deine Hilfe ! face-smile

Mfg Sven


 
'on error resume next  

strComputer = "."  
Set objOU = GetObject ("LDAP://OU=xxx,DC=ca")  
Set objFSO = CreateObject("Scripting.FileSystemObject")  
Set objTextFile = objFSO.CreateTextFile ("\\rinas1p2\users\xxxs\Desktop\x\XXX.txt", ForAppending = 8)  

	for each objMember in objOU

		if objMember.Class = "computer" and objMember.operatingSystem = "Windows XP Professional" then  

			set objLastLogon = objMember.Get("lastLogonTimestamp")  
			i8High = objLastLogon.HighPart
			i8Low = objLastLogon.LowPart 

				If (i8Low < 0) Then
				i8High = i8High + 1
			End If

				intLastLogonTime = i8High  * (2^32) + i8Low 
				intLastLogonTime = intLastLogonTime / (60 * 10000000)
				intLastLogonTime = intLastLogonTime / 1440

	
				Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")  
				Set colPings = objWMIService.ExecQuery("Select * From Win32_PingStatus where Address ='"& objMember.sAMAccountName & "'")  
				For Each objItem In colPings
				onlStatus = objItem.PrimaryAddressResolutionStatus 

				Next

			objTextFile.WriteLine("PC Name:  " & objMember.Name & " , Operating System :" & objMember.operatingSystem & " , " & intLastLogonTime + #1/1/1601# & "Onlinestatus : " & onlstatus)  

		end if
		
		next
objTextFile.Close

set objOU = nothing
set objMember = nothing
set objLastLogon = nothing
set objWMIService = nothing

wscript.quit
Mitglied: bastla
bastla 28.03.2012 um 21:33:15 Uhr
Goto Top
Hallo DerSven2!

Ah ja, dass Computernamen automatisch mit "$" am Ende dargestellt werden, hatte ich auch nicht bedacht - aber dagegen gibt's ja "Replace()", also etwa:
Replace(objMember.sAMAccountName, "$", "")
Grüße
bastla
Mitglied: DerSven2
DerSven2 28.03.2012 um 22:20:51 Uhr
Goto Top
Also an dieser Stelle ein BIG THANK YOU - an dich !

es klappt nun einwandfrei.

Ich moechte es noch um ein paar Kleinigkeiten erweitern (aktuell angemldeter USer (mit Sysinternals sollte das einfach sein) und aktuelle OU, vielleicht noch "aktiv/disabled" aber das ist alles Kosmetik.)

Ich werde ein Update posten sobald es feritg ist damit andere auch davon profitieren koennen - fuer mich ist heute Feierabend ich bin auf ein Bier - ich lad dich virutell zumindest ein da ich gerade in Kanda sitze ! ;)
Danke und beste Gruesse
Sven


ps. das mit" Replace(objMember.sAMAccountName, "$", "") ist wirklich brauchbar - damit sollte sich ansich das "CN= " Problem auch loesen lassen (verusuche ich morgen mal )
Mitglied: bastla
bastla 28.03.2012 um 22:26:37 Uhr
Goto Top
Hallo DerSven2!
damit sollte sich ansich das "CN= " Problem auch loesen lassen
Das sollte sich ja mit "sAMAccountName" ohnehin nicht mehr ergeben - ansonsten gäbe es auch noch "Split()":
Split(objMember.Name, "=")(1)
Grüße
bastla

... und Prost face-wink
Mitglied: DerSven2
DerSven2 30.03.2012 um 15:59:21 Uhr
Goto Top
in Post 1 nun die letzte Version gepostet - Danke noch mal - jetzt ist nur noch Kosmetik angesagt face-smile