chussi
Goto Top

WMI Abfrage - Freier Festplattenplatz

Hallo,

habe folgendes Script geschrieben ( zusammen gebastelt face-smile )

arrComputers = Array("servername1", "servername2")
For Each strComputer In arrComputers
WScript.Echo "Server: " & strComputer
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
Set colItems = objWMIService.ExecQuery( _
"SELECT * FROM Win32_LogicalDisk WHERE Caption = 'D:'")
For Each objItem in colItems
Wscript.Echo "Freier Platz auf LW D:\ : " & objItem.FreeSpace/1024/1024/1024 & " GB"
Next
Next

Meine Fragen:
Wie kann ich das Ergebnis in ein Textfile schreiben ?
Bisher kommt ja immer ein PopUp Fenster hoch.

Und zur besseren Übersicht: Wie kann ich den Freien Platz auf 2 Nachkomma Stellen begrenzen ?

Gruss Christian

Content-Key: 56330

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

Printed on: April 19, 2024 at 14:04 o'clock

Mitglied: 46503
46503 Apr 11, 2007 at 10:05:48 (UTC)
Goto Top
WMI ist doof. face-big-smile Ich habe mich damit mal kurz beschäftigt und es für zu unübersichlich empfunden. Wie man umleitet, kann ich dir nicht sagen.

Es geht aber (lokal) einfacher mit dem Kommandozeilentool fsutil (in XP Prof enthalten), remote mit Hilfe von psexec (ehem. Sysinternals).

fsutil volume diskfree LW: | find "gbarer Bytes" > frei.txt
Member: rubberduck
rubberduck Apr 12, 2007 at 07:01:04 (UTC)
Goto Top
@ hpdnm
WMI ist doof. Ich habe mich damit mal kurz beschäftigt und es für zu unübersichlich empfunden.
Tolle Aussage...

Mit WMI kannst Du Praktisch das gesamte OS steuern. Vielleicht solltest Du Dich etwas mehr damit beschäftigen. Es stimmt allerdings, das es Zeit braucht. Der Lohn ist aber die Mühe Wert.

@chussi
Versuch mal das:
arrComputers = Array("servername1", "servername2")
strDomain = "Meine Domain"
strLogin = "Domain Admin"
strPW = "MeinDomainAdminPasswort"
'strLogin = "Administrator"
'strPW = "MeinAdminPasswort"

Dim textstream, objFSO, GstrLogfile, ITextStream, objLocator, objWMI, strDomain
GstrLogfile = "C:\MeinOrdner\FreeSpace.LOG"

Set objFSO = CreateObject("Scripting.FileSystemObject")

If Not objFSO.FileExists(GstrLogfile) Then
Set Textstream = objFSO.CreateTextFile(GstrLogfile, True)
Textstream.close
End If

For Each strComputer In arrComputers
WScript.Echo "Server: " & strComputer
Set objLocator = CreateObject("WbemScripting.SWbemLocator") 'Wenn Du es mit diesem Object machst, kannst Du es lokal nicht Testen!
Set objWMI = objLocator.ConnectServer(strComputer, "root\CIMv2", strDomain & "\" & strLogin, strPW)'Anmeldung als Domain Adminstrator
'Set objWMI = objLocator.ConnectServer(strComputer, "root\CIMv2", strComputer & "\" & strLogin, strPW)'lokale Anmeldung als Administrator

WQL = "SELECT * FROM Win32_LogicalDisk WHERE Caption = 'D:'"
Set objWMI = objWMI.ExecQuery(WQL)
For Each intFreeSpace In objWMI
Set textstream = objFSO.OpenTextFile(GstrLogfile, 8, true)
TextStream.WriteLine strComputer & ";Freier Platz auf LW D:\;" & round(intFreeSpace.FreeSpace/1024/1024/1024,2) & " GB"
TextStream.Close
Next
Next
Schreibst Du wirklich alle Server in ein Array? Habt Ihr nur so wenige?
Mitglied: 46503
46503 Apr 12, 2007 at 08:52:35 (UTC)
Goto Top
@rubberduck

Entschuldige bitte, dass ich eine eigene Meinung habe, auch wenn sie dir nicht passt.

Ich keinne mein System und weiß, ich wie einfacher und schneller an gewünschte Informationen komme.
Member: rubberduck
rubberduck Apr 12, 2007 at 09:05:17 (UTC)
Goto Top
Entschuldigung angenommen ;)

Ich habe nicht Deine Meinung kritisiert.
Mit Shell-Scripting kenne ich mich auch aus und verwende sie auch rege.

Du solltest nur nicht andere Techniken Pauschal verteufeln, nur weil Du vor der Informationsflut wie der Esel vor dem Berg stehst. Das ist alles.

Wenn Du aber echte Scripts schreibst, kannst Du (wenn nötig) den Ein- und Ausgabestrom besser auswerten als Du es mit Shell-Scripting kannst. Ausserdem bist Du viel flexibler.
Mitglied: 46503
46503 Apr 12, 2007 at 09:23:23 (UTC)
Goto Top
Vielleicht habe ich grundsätzlich aus Sicherheitsgründen etwas gegen Scripte auf meinem System?
Ich brauche keine Scripte, um an Informationen zu kommen, ich kenne mich mit der Win32API aus und
stehe auch nicht "vor der Informationsflut wie der Esel vor dem Berg". Mach dir um mich mal keine Sorgen. face-big-smile
Member: rubberduck
rubberduck Apr 12, 2007 at 09:32:11 (UTC)
Goto Top
O.K.
War ja nicht böse gemeint ;)

Es hatte nur so einen schalen Pauschalen Beigeschmack.

Ist aber Cool, wenn Du Dich mit API-Programmierung auskennst.
Dort fehlt mir leider die Zeit mich einzulesen...
Member: chussi
chussi Apr 12, 2007 at 11:10:01 (UTC)
Goto Top
Ziemlich geil !!!! Vielen Dank.

Zwar hab ich noch nicht geblickt, wie ich generell in ein Textfile schreibe, aber vielleicht kommt es ja, wenn ich es noch 20mal durchlese.

Der nächste Schritt wäre Speicher etc auslesen und in Textfiles schreiben.

Kennst du zufällig ein gutes Buch ? Sowas wie WMI for Dummies oder so ?
Oder ne guten Link wo es StepbyStep beschrieben ist.
Programmieren ist nämlich eigentlich so gar net mein Ding face-sad

Noch eine Frage zu dem Skript.
Wenn ich das Skript mehrmals ausführe, hängt er die aktuellen Daten hinterdran.
Schön wäre, wenn ich das aktuelle Datum hinzufügen könnte.
Wie geht das ?

Gruss Christian
Member: rubberduck
rubberduck Apr 12, 2007 at 11:57:30 (UTC)
Goto Top
1 ScriptingCenter
2 Windows Script 5.6 Documentation (VBS-Funktionen einfach erklärt)
WMI CIM Studio (WMI Tools) bei Microsoft herunterladen
Scriptomatic (Microsoft gratis)
Systemscripter (Kostenpflichtig)
Scripting für Administratoren (ISBN: 3-86063-979-X)

So. Damit bist Du ausgestattet (jedenfalls bis es vielleicht nur noch PowerShell gibt).

*
Die Frage mit dem Datum:

TextStream.WriteLine FormatDateTime(Date,2) & ";" & strComputer & ";Freier Platz auf LW D:\;" & round(intFreeSpace.FreeSpace/1024/1024/1024,2) & " GB"

FormatDateTime(date,Wert)
24
vbShortDate vbShortTime
*

wql = "select * from Win32_LogicalMemoryConfiguration"
Der Wert für den Memory ist "TotalPhysicalMemory"

Wenn es jetzt keine konkreten Fragen mehr gibt, dann wünsche ich Dir viel Spass beim Üben ;)
Member: chussi
chussi Apr 12, 2007 at 13:26:34 (UTC)
Goto Top
face-smile

naja, eine kleine Frage noch.
Wenn ich Laufwerke C: und D: abfragen möchte habe ich die Abfrage wie folgt verändert
*
WQL = "SELECT * FROM Win32_LogicalDisk WHERE Caption = 'C:' OR CAPTION = 'D:'"
*

Wie schreibe das ich das Textfile, so dass die Ausgabe lautet:

12.04.2007;server1;Freier Platz auf LW C:\ 4,43 GB
12.04.2007;server2;Freier Platz auf LW D:\ 81,35 GB
Member: rubberduck
rubberduck Apr 12, 2007 at 13:56:23 (UTC)
Goto Top
Konform für ein *.csv File:
For Each intFreeSpace In objWMI
If intFreeSpace.name = "C:" Then
intC = round(intFreeSpace.FreeSpace/1024/1024/1024,2)
ElseIf intFreeSpace.name = "D:" Then
intD = round(intFreeSpace.FreeSpace/1024/1024/1024,2)
End If
Next
Set textstream = objFSO.OpenTextFile(GstrLogfile, 8, true)
TextStream.WriteLine FormatDateTime(Date,2) & ";" & strComputer & ";C:\;" & intC & " GB;D:\;" & intD & " GB"
TextStream.Close
Next

Wenn Du wirklich zwei Zeilen (C,D) möchtest:
If intFreeSpace.name = "C:" Then
intC = round(intFreeSpace.FreeSpace/1024/1024/1024,2)
Set textstream = objFSO.OpenTextFile(GstrLogfile, 8, true)
TextStream.WriteLine FormatDateTime(Date,2) & ";" & strComputer & ";C:\;" & intC & " GB"
TextStream.Close
ElseIf intFreeSpace.name = "D:" Then
intD = round(intFreeSpace.FreeSpace/1024/1024/1024,2)
Set textstream = objFSO.OpenTextFile(GstrLogfile, 8, true)
TextStream.WriteLine FormatDateTime(Date,2) & ";" & strComputer & ";C:\;" & intD & " GB"
TextStream.Close
End If
Hier würde sich eine Funktion zum schreiben in ein TextFile anbieten. Ist vielleicht gar nicht so schlecht zum üben face-wink