marzli2 10 Geschrieben 15. Mai 2009 Melden Teilen Geschrieben 15. Mai 2009 hi, habe von einem kollegen eine vorlage bekommen für ein script, welches alle dc ausgibt. nun möchte ich jeden dc nach einem bestimmten dienst abfragen, und den status dann mit dem namen des dc in eine liste schreiben. ich hab schon lange nichts mehr mit vb zu tun gehabt, daher bitte ich um hilfe. mein teil, der noch nicht funktioniert, ist FETT. wäre wohl zu einfach. unter dem script ist auch gleich das originalscript. hilfe wäre suuuuuuuuuuuper. danke ' EnumDCs.vbs ' VBScript program to enumerate all Domain Controllers in the domain. ' ' ---------------------------------------------------------------------- ' Copyright © 2002 Richard L. Mueller ' Hilltop Lab web site - Hilltop Lab ' Version 1.0 - November 10, 2002 ' Version 1.1 - February 19, 2003 - Standardize Hungarian notation. ' Version 1.2 - March 11, 2003 - Remove SearchScope property. ' ' Program enumerates all Domain Controllers, their DNS host name, and ' the name of the site they reside in. ' ' You have a royalty-free right to use, modify, reproduce, and ' distribute this script file in any way you find useful, provided that ' you agree that the copyright owner above has no warranty, obligations, ' or liability for such use. Option Explicit Dim objRootDSE, strConfig, adoConnection, adoCommand, strQuery Dim adoRecordset, objDC, objSite ' Determine configuration context from RootDSE object. Set objRootDSE = GetObject("LDAP://RootDSE") strConfig = objRootDSE.Get("configurationNamingContext") ' Use ADO to search Active Directory for ObjectClass nTDSDSA. Set adoCommand = CreateObject("ADODB.Command") Set adoConnection = CreateObject("ADODB.Connection") adoConnection.Provider = "ADsDSOObject" adoConnection.Open "Active Directory Provider" adoCommand.ActiveConnection = adoConnection strQuery = "<LDAP://" & strConfig _ & ">;(ObjectClass=nTDSDSA);AdsPath;subtree" adoCommand.CommandText = strQuery adoCommand.Properties("Page Size") = 100 adoCommand.Properties("Timeout") = 30 adoCommand.Properties("Cache Results") = False Set adoRecordset = adoCommand.Execute ' The parent object of each object with ObjectClass=nTDSDSA is a Domain ' Controller. The parent of each Domain Controller is a "Servers" ' container, and the parent of this container is the "Site" container. Do Until adoRecordset.EOF Set objDC = GetObject( _ GetObject(adoRecordset.Fields("AdsPath").Value).Parent) Set objSite = GetObject(GetObject(objDC.Parent).Parent) cmd("sc query "Automatisches LiveUpdate - Scheduler" >> C:\test.txt ") adoRecordset.MoveNext Loop adoRecordset.Close ' Clean up. adoConnection.Close Set objRootDSE = Nothing Set adoCommand = Nothing Set adoConnection = Nothing Set adoRecordset = Nothing Set objDC = Nothing Set objSite = Nothing Wscript.Echo "Done" ----------------originalscript - auszug - ohne meine änderungen. (fett hab ich gelöscht) GetObject(adoRecordset.Fields("AdsPath").Value).Parent) Set objSite = GetObject(GetObject(objDC.Parent).Parent) Wscript.Echo "Domain Controller: " & objDC.cn & vbCrLf _ & "DNS Host Name: " & objDC.DNSHostName & vbCrLf _ & "Site: " & objSite.name adoRecordset.MoveNext Zitieren Link zu diesem Kommentar
Dukel 454 Geschrieben 15. Mai 2009 Melden Teilen Geschrieben 15. Mai 2009 Sieht auf dem ersten Blick nach Anführungszeichen Problem aus. Zitieren Link zu diesem Kommentar
Cybquest 36 Geschrieben 15. Mai 2009 Melden Teilen Geschrieben 15. Mai 2009 auf den 2. Blick ausserdem: - wo ist "cmd" definiert? Meines Wissens ist das keine VBS-Funktion Da kenn ich nur sowas wie WShell.run... - In o.g. Fall liefert "sc query" aber nur die Daten des Rechners, von dem aus das Script aufgerufen wurde. Ist das hier so gewünscht? Zitieren Link zu diesem Kommentar
marzli2 10 Geschrieben 15. Mai 2009 Autor Melden Teilen Geschrieben 15. Mai 2009 das kann sein. ich hab damals einiges mit vba gemacht. daher hab ich das noch. kann mir jemand den befehl korrekt übergeben? es soll vom aktuell gewählten dc der dienst gecheckt werden, dann gehts zum nächsten dc etc etc. - das macht das script ja auch Zitieren Link zu diesem Kommentar
Dukel 454 Geschrieben 15. Mai 2009 Melden Teilen Geschrieben 15. Mai 2009 Powershell: #DC's auslesen: $dcs = & dsquery server | % {$_.replace('"','').split(',')[0].replace("CN=","")} #Dienst testen: foreach($dc in $dcs){ & sc.exe $dc query "wuauserv" | out-file C:\test.txt -append } Zitieren Link zu diesem Kommentar
marzli2 10 Geschrieben 15. Mai 2009 Autor Melden Teilen Geschrieben 15. Mai 2009 muss ich da nochwas dimensioneren? (DIM) und wo genau gehört das dann ins script? sorry und danke! Zitieren Link zu diesem Kommentar
Dukel 454 Geschrieben 15. Mai 2009 Melden Teilen Geschrieben 15. Mai 2009 muss ich da nochwas dimensioneren? (DIM)und wo genau gehört das dann ins script? sorry und danke! ? Was meinst du mit dimensionieren? Und wen meinst du? Zitieren Link zu diesem Kommentar
blub 115 Geschrieben 15. Mai 2009 Melden Teilen Geschrieben 15. Mai 2009 @marzli, mal ehrlich, hast du jemals eine Zeile Code in vb/vba/vbs geschrieben? Kennst du überhaupt den Unterschied? Zitieren Link zu diesem Kommentar
marzli2 10 Geschrieben 18. Mai 2009 Autor Melden Teilen Geschrieben 18. Mai 2009 ich hab damals vba gemacht. aber auch nur learning by doing. und anscheinend funktioniert vb script doch etwas anders :) von daher: kann mir jemand das script mit den funktionen komplett posten. das wäre nett Zitieren Link zu diesem Kommentar
marzli2 10 Geschrieben 18. Mai 2009 Autor Melden Teilen Geschrieben 18. Mai 2009 @dukel wenn ich das in der powershell ausführe, bekomme ich immer nur die meldung: unbekannter befehl und dann die featurebeschreibung von SC Zitieren Link zu diesem Kommentar
Cybquest 36 Geschrieben 18. Mai 2009 Melden Teilen Geschrieben 18. Mai 2009 In Deinem VBScript könntest du ggf. auch die SC-Zeile durch sowas in der Art ersetzen: strServer=mid(objDC.Name,4) strService = "wuauserv" On error resume next Set dienst = GetObject("WinNT://" & strServer & "/" & strService & ",service") If Err=0 then if dienst.status = 4 then wscript.echo "Dienst " & strService & " auf " & strServer & " gestartet" else wscript.echo "Dienst " & strService & " auf " & strServer & " nicht gestartet" end if else 'Fehler wscript.echo "Dienst " & strService & " auf " & strServer & " nicht installiert" end if On error goto 0 Statt wscript.echo wäre auch eine Ausgaben in eine Datei möglich. Die Startart (Autom./Manuell...) könnte man auch noch mit erfassen über "dienst.StartType". Zitieren Link zu diesem Kommentar
marzli2 10 Geschrieben 18. Mai 2009 Autor Melden Teilen Geschrieben 18. Mai 2009 kannst du es für die dummen (/me) auch komplett mit dem script posten. danke! Zitieren Link zu diesem Kommentar
Cybquest 36 Geschrieben 18. Mai 2009 Melden Teilen Geschrieben 18. Mai 2009 ...sich Scripte zusammensuchen, keine Ahnung davon haben und dann von anderen umbauen lassen - typisch :D Hier mit Ausgabe in CSV. Die von mir eingefügten Zeilne stehen jeweils zwischen den Rauten-Kommentaren. ' VBScript program to enumerate all Domain Controllers in the domain. ' ' ---------------------------------------------------------------------- ' Copyright (c) 2002 Richard L. Mueller ' Hilltop Lab web site - Hilltop Lab ' Version 1.0 - November 10, 2002 ' Version 1.1 - February 19, 2003 - Standardize Hungarian notation. ' Version 1.2 - March 11, 2003 - Remove SearchScope property. ' ' Program enumerates all Domain Controllers, their DNS host name, and ' the name of the site they reside in. ' ' You have a royalty-free right to use, modify, reproduce, and ' distribute this script file in any way you find useful, provided that ' you agree that the copyright owner above has no warranty, obligations, ' or liability for such use. 'Option Explicit '########## strFileName = "C:\DC-Dienste.csv" strService = "wuauserv" Set MyFiles = CreateObject("Scripting.FileSystemObject") Set f = MyFiles.OpenTextFile(strFilename, 2, True) f.writeline "Server;Dienst;Status;Startart" '########## Set WSHShell = WScript.CreateObject("WScript.Shell") Dim objRootDSE, strConfig, adoConnection, adoCommand, strQuery Dim adoRecordset, objDC, objSite ' Determine configuration context from RootDSE object. Set objRootDSE = GetObject("LDAP://RootDSE") strConfig = objRootDSE.Get("configurationNamingContext") ' Use ADO to search Active Directory for ObjectClass nTDSDSA. Set adoCommand = CreateObject("ADODB.Command") Set adoConnection = CreateObject("ADODB.Connection") adoConnection.Provider = "ADsDSOObject" adoConnection.Open "Active Directory Provider" adoCommand.ActiveConnection = adoConnection strQuery = "<LDAP://" & strConfig _ & ">;(ObjectClass=nTDSDSA);AdsPath;subtree" adoCommand.CommandText = strQuery adoCommand.Properties("Page Size") = 100 adoCommand.Properties("Timeout") = 30 adoCommand.Properties("Cache Results") = False Set adoRecordset = adoCommand.Execute ' The parent object of each object with ObjectClass=nTDSDSA is a Domain ' Controller. The parent of each Domain Controller is a "Servers" ' container, and the parent of this container is the "Site" container. Do Until adoRecordset.EOF Set objDC = GetObject( _ GetObject(adoRecordset.Fields("AdsPath").Value).Parent) Set objSite = GetObject(GetObject(objDC.Parent).Parent) '########## strServer=mid(objDC.Name,4) On error resume next Set dienst = GetObject("WinNT://" & strServer & "/" & strService & ",service") If Err=0 then Select Case dienst.status case 1 strStatus ="gestoppt" case 4 strStatus ="gestartet" case else strStatus ="unbekannt" end select Select Case dienst.starttype case 2 strStartart ="Automatisch" case 3 strStartart ="Manuell" case 4 strStartart ="Deaktiviert" case else strStartart ="unbekannt" end select else 'Fehler strStatus = "nicht installiert" strStartart = "" end if f.writeline strServer & ";" & strService & ";" & strStatus & ";" & strStartart On error goto 0 '########## adoRecordset.MoveNext Loop adoRecordset.Close ' Clean up. adoConnection.Close Set objRootDSE = Nothing Set adoCommand = Nothing Set adoConnection = Nothing Set adoRecordset = Nothing Set objDC = Nothing Set objSite = Nothing '########## f.close Set MyFiles = Nothing Wscript.Echo "Fertig. Ausgabedatei: " & StrFilename '########## Zitieren Link zu diesem Kommentar
marzli2 10 Geschrieben 18. Mai 2009 Autor Melden Teilen Geschrieben 18. Mai 2009 früher hatte man mal zeit, sich damit zu befassen, heute nimmer :) dafür helf ich mal wieder einem anderen, ok?! :) vielen dank Zitieren Link zu diesem Kommentar
d.stegemann 10 Geschrieben 18. Mai 2009 Melden Teilen Geschrieben 18. Mai 2009 Als kleine Ergänzung zu Frank's Weg über den WinNT Provider eine Möglichkeit das per wmi zu machen... Dim objWMIService, colItems strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") Set colItems = objWMIService.ExecQuery( _ "SELECT * FROM Win32_Service",,48) For Each objItem in colItems If instr(objItem.Name, "Automatisches LiveUpdate - Scheduler") > 0 Then state = objItem.State b_found = True Exit For Else End if Next If b_found Then MsgBox "Service " & objItem.Name &" state "& state Else MsgBox "Service Not found" End If Gruß Dirk Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.