Festplattenbelegung per Script auslesen

Habe gelesen, dass man statt Int, Float verwenden soll, damit die Kommastellen auch richtig angezeigt werden.

So sieht der Code aktuell aus.

Code:
/*
      Determines the amount of free space available for the caller.
      Runs on Windows 95 retail and later, and on Windows 4.0 and later.  
      Uses GetDiskFreeSpaceEx if available, otherwise reverts to
      GetDiskFreeSpace.

      To determine the amount of available space correctly:

       * Use 64-bit math with the return values of both GetDiskFreeSpace
         and GetDiskFreeSpaceEx so that you can determine the sizes of
         volumes that are larger than 2GB.

      Programs that need to determine how much free space the current user
      can have (such as whether there is enough space to complete an
      installation) have an additional requirement:

       * Use the lpFreeBytesAvailableToCaller value from
         GetDiskFreeSpaceEx rather than lpTotalNumberOfFreeBytes.  
         This is because Windows 2000 has disk quota management that
         administrators may use to limit the amount of disk space that
         users may use.
*/ 

// gcc -c dfwin.c
//
// gcc dfwin.o -o dfwin



#include <windows.h>
#include <stdio.h>


typedef BOOL (WINAPI *P_GDFSE)(LPCTSTR, PULARGE_INTEGER, 
                               PULARGE_INTEGER, PULARGE_INTEGER);

void main (int argc, char **argv)
{
   BOOL  fResult;

   char  *pszDrive  = NULL,
          szDrive[4];

   DWORD dwSectPerClust,
         dwBytesPerSect,
         dwFreeClusters,
         dwTotalClusters;

   P_GDFSE pGetDiskFreeSpaceEx = NULL;

   unsigned __int64 i64FreeBytesToCaller,
                    i64TotalBytes,
                    i64FreeBytes;

   /*
      Command line parsing.

      If the drive is a drive letter and not a UNC path, append a 
      trailing backslash to the drive letter and colon.  This is 
      required on Windows 95 and 98.
   */ 
   if (argc != 2)
   {
      printf ("usage:  %s <drive|UNC path>\n", argv[0]);
      printf ("\texample:  %s C:\\\n", argv[0]);
      return;
   }

   pszDrive = argv[1];

   if (pszDrive[1] == ':')
   {
      szDrive[0] = pszDrive[0];
      szDrive[1] = ':';
      szDrive[2] = '\\';
      szDrive[3] = '\0';

      pszDrive = szDrive;
   }

   /*
      Use GetDiskFreeSpaceEx if available; otherwise, use
      GetDiskFreeSpace.

      Note: Since GetDiskFreeSpaceEx is not in Windows 95 Retail, we
      dynamically link to it and only call it if it is present.  We 
      don't need to call LoadLibrary on KERNEL32.DLL because it is 
      already loaded into every Win32 process's address space.
   */ 
   pGetDiskFreeSpaceEx = (P_GDFSE)GetProcAddress (
                            GetModuleHandle ("kernel32.dll"),
                                             "GetDiskFreeSpaceExA");
   if (pGetDiskFreeSpaceEx)
   {
      fResult = pGetDiskFreeSpaceEx (pszDrive,
                              (PULARGE_INTEGER)&i64FreeBytesToCaller,
                              (PULARGE_INTEGER)&i64TotalBytes,
                              (PULARGE_INTEGER)&i64FreeBytes);
      if (fResult)
      {
         printf ("\n\nGetDiskFreeSpaceEx reports\n\n");
         printf ("Available space to caller = %I64u MB\n",
                 i64FreeBytesToCaller / (1024*1024));
         printf ("Total space               = %I64u MB\n",
                 i64TotalBytes / (1024*1024));
         printf ("Free space on drive       = %I64u MB\n",
                 i64FreeBytes / (1024*1024));
         printf ("Used space on drive       = %d.3 GB\n",
                 (i64TotalBytes-i64FreeBytes) / (1024*1024*1024));
      }
   }
   else
   {
      fResult = GetDiskFreeSpace (pszDrive, 
                                  &dwSectPerClust,
                                  &dwBytesPerSect, 
                                  &dwFreeClusters,
                                  &dwTotalClusters);
      if (fResult)
      {
         /* force 64-bit math */ 
         i64TotalBytes = (__int64)dwTotalClusters * dwSectPerClust *
                           dwBytesPerSect;
         i64FreeBytes = (__int64)dwFreeClusters * dwSectPerClust *
                           dwBytesPerSect;

         printf ("GetDiskFreeSpace reports\n\n");
         printf ("Free space  = %I64u MB\n", 
                 i64FreeBytes / (1024*1024));
         printf ("Total space = %I64u MB\n", 
                 i64TotalBytes / (1024*1024));
      }
   }

   if (!fResult)
      printf ("error: %lu:  could not get free space for \"%s\"\n",
              GetLastError(), argv[1]);
}
 
Revan335 schrieb:
Habe gelesen, dass man statt Int, Float verwenden soll, damit die Kommastellen auch richtig angezeigt werden.


So sieht der Code aktuell aus.

Code:
...
         printf ("Used space on drive       = %d.3 GB\n",
                 (i64TotalBytes-i64FreeBytes) / (1024*1024*1024));
...
Ersetze die obige Zeile durch
Code:
         printf ("Used space on drive       = %.3lf GB\n",
                 (i64TotalBytes-i64FreeBytes) / (1024.0*1024.0*1024.0));
Das ".3" gibt übrigens die Nachkommastellen an (für den Fall, daß Du das ändern willst ;) )


HTH

BigNum
 
Vielen Dank, werde ich dann mal am Donnerstag produktiv testen.

Zu Hause klappt es schon mal.
 
Zuletzt bearbeitet:
Gibt es eine Möglichkeit, die auszulesenden Platten der verschiedenen Server in ein anderes Script zu schreiben und die Ausgabe in ner txt abzulegen ?

Kann man dem Script dann auch sagen, führe die cmd als User x aus mit Passwortabfrage des jeweiligen Users ?


Ich stelle mir das so vor:

Ich starte das Script, die cmd fragt mich nachdem Passwort, nach der Eingabe rattert der die Server Platten runter und gibt die Ergebnisse in einer txt aus.


Ist so was realisierbar ?

Wenn es nur ohne den User und Passwort Abfrage geht, dann ist das es auch egal.

Es gibt bestimmt noch ne Möglichkeit, an die Ergebnisse ohne User und Passwort Abfrage zu kommen.

Aktuell ist es nämlich so, dass ich um von meinem User aus, an die Daten zu kommen, die cmd als Domäne Admin ausführen muss, sonst sagt er error: 22/53: could not get free space for "Pfad"

Danke schon mal.
 
Zuletzt bearbeitet:
Kann mir da einer bei helfen, erstmal nur das Script ?

Das müsste doch so aussehen:

Code:
@echo off

rem Festplattenbelegung auslesen

rem 03.10.2012 DL Erstellung


dfwin.exe C:\ >C:\Users\Test\Festplattenbelegung_auslesen_log.txt


echo. >> %LOGFILE%
echo ----------------------------------------------------------------------------------- >> %LOGFILE%

Pause
Oder muss ich ihm noch explizit sagen, wo die dfwin.exe liegt ?
Ergänzung ()

Also eine Log Datei erstellt er schon mal.

Nur wird immer eine neue erstellt.
 
Zuletzt bearbeitet:
Revan335 schrieb:
Nur wird immer eine neue erstellt.
Wenn du möchtest, dass die Log-Datei nicht immer neu erstellt wird, sondern neue Textzeilen hinzugefügt werden, musst du auch bei dem Aufruf von dfwin.exe mit >> anstelle von > arbeiten.

/Edit
Revan335 schrieb:
Kann man dem Script dann auch sagen, führe die cmd als User x aus mit Passwortabfrage des jeweiligen Users ?
Unter welcher Windows Version soll das denn laufen? XP, oder Vista/7?
 
Zuletzt bearbeitet:
Danke.

Ich möchte dann auch noch, dass er mehrmals dfwin.exe mit verschiedenen Pfaden ausführt und alles in eine separate txt speichert.

Was schon mal klappt.

Nach jedem Durchlauf soll er aber noch eine Trennlinie einfügen.

Das klappt noch nicht.
Ergänzung ()

Mein Rechner auf der Firma ist noch XP.

Wird aber demnächst wie alle anderen auch auf Win 7 upgegradet.

Code:
@echo off

rem Festplattenbelegung auslesen

rem 03.10.2012 DL Erstellung


dfwin.exe C:\ >>C:\Users\Test\Festplattenbelegung_auslesen_log.txt
echo --------------------------------------------------------------------------------
dfwin.exe C:\ >>C:\Users\Test\Festplattenbelegung_auslesen_log2.txt
echo --------------------------------------------------------------------------------


Pause

Die Linien werden auch in der cmd angezeigt, nur nicht im Log.
 
Zuletzt bearbeitet:
Revan335 schrieb:
Nach jedem Durchlauf soll er aber noch eine Trennlinie einfügen.

Das klappt noch nicht.
Kann ja auch nicht klappen, da du zwar eine Variable namens %LOGFILE% angegeben hast, die aber vorher nicht definiert hast. Woher soll das Skript also wissen, was es mit dieser Variable anfangen soll?

Warum gibst du eigentlich den gesamten Pfad an, wo die Log-Datei gespeichert werden soll? Soll das ein fester Pfad sein unabhängig davon, wo das Skript ausgeführt wird, oder willst du die Log-Datei im Skript-Ordner haben?

Revan335 schrieb:
Mein Rechner auf der Firma ist noch XP.

Wird aber demnächst wie alle anderen auch auf Win 7 upgegradet.
Ok, Wie meinst du das mit Admin Domäne? Willst du, dass das Skript unter einem bestimmten Benutzer ausgeführt wird, oder reichen auch stinknormale Admin-Rechte?
 
Gedacht ist das Script um die Festplattenbelegung der Server auszulesen.

Muss ich morgen mal gucken, aber ich denke nicht das mit Lokalen Admin Rechten klappt, da der ja keinen Zugriff auf die Domäne hat.

Jeden Morgen soll man das dann unter seinem User starten und die Logdatei bspw. auf dem Fileserver speichern.

dfwin.exe sowie das Script liegt dann wahrscheinlich auch irgendwo auf dem Fileserver.
 
Zuletzt bearbeitet:
Revan335 schrieb:
Gedacht ist das Script um die Festplattenbelegung der Server auszulesen.
Damit beantwortest du nicht meine Frage.

Revan335 schrieb:
Die Linien werden auch in der cmd angezeigt, nur nicht im Log.
Du hast die Umleitung in die Log-Datei vergessen.
 
Hab ich bereits editiert. s. oben.

Jeden Morgen soll man das dann unter seinem User starten und die Logdatei bspw. auf dem Fileserver speichern.

dfwin.exe sowie das Script liegt dann wahrscheinlich auch irgendwo auf dem Fileserver.
Code:
@echo off

rem Festplattenbelegung auslesen

rem 03.10.2012 DL Erstellung

set LOGFILE=C:\Users\Test\Festplattenbelegung_auslesen_log.txt

dfwin.exe C:\ >> %LOGFILE%

echo. >> %LOGFILE%
echo ----------------------------------------------------------------------------------- >> %LOGFILE%

set LOGFILE=C:\Users\Test\Festplattenbelegung_auslesen_log2.txt

dfwin.exe C:\ >> %LOGFILE%

echo. >> %LOGFILE%
echo ----------------------------------------------------------------------------------- >> %LOGFILE%


Pause
Ergänzung ()

Ich mag XP nicht.

Also unter meinem User klappt es nicht, C: auszulesen.

Da sagt er mir Zugriff verweigert.

Also brauch das Script wohl schon Admin Rechte um das Lokale Laufwerk C auszulesen.

Beim runas Lokaler Admin findet der komischerweise cmd nicht.
 
Zuletzt bearbeitet:
Hab das Script mit runas User:Administrator ausgeführt, nur sagt er mir das er die angegebene Datei nicht finden kann.

Meint er damit die dfwin.exe, wenn ja, wo muss die Datei hin, damit er sie findet ?

die cmd kann es nicht sein, da ein Konsolenfenster geöffnet ist und darin die Meldung steht.
 
Zuletzt bearbeitet:
Hi,

ist es möglich, im Log auch noch das Datum und den Namen des Servers und der Partition reinzuschreiben ?

Falls möglich am liebsten mit ner Variable wie die Logdatei.

Das mit dem runas scheint sich erledigt zu haben, er zeigt zwar immer noch den Fehler das er die angegebene Datei nicht finden kann an, aber erstellt die Logdatei inklusive Inhalt.
 
Arbeite jetzt unter Win 7 Pro x64.

Irgendwie klappt das mit dem auslesen noch nicht ganz.

Ich führe das Script aus, bekomme aber im Log die Meldung: "could not get free space for" mit den Errors 3/5/53/67/1326.

Bei einem Server Laufwerk die 3 bei einem anderen die 5 und so weiter.

Wenn ich mein lokales C auslesen will, klappt das.

Verwende den Befehl runas [/user:<Administrator@Domäne>].

Ist der runas Befehl falsch oder irgendwas anderes ?


Danke schon mal für eure weitere Hilfe.
Ergänzung ()

Eine weitere Erkenntnis.

Wenn ich die cmd per Domäne Admin ausführen und dann darüber das Script starte, funktioniert es bei den meisten Platten/Servern.

Also muss irgendwas an dem runas Befehl falsch sein.
 
Zuletzt bearbeitet:
Sind Probleme mit 2 TB Platten bekannt ?

Es werden nämlich 46 GB mehr als wirklich belegt angezeigt.
 
Was muss ich der cmd sagen, damit er das Script was auf dem Server liegt, ausführt.

mit \\Server "Festplattenbelegung auslesen.bat" bekomme ich die Meldung: Das System kann auf die Datei nicht zugreifen.

cmd ist mit Domäne Administrator Rechten ausgeführt.


Das Problem mit dem ca. 46 GB mehr Speicherplatz im Log als real auf dem Server besteht noch.

Ist eine 2 TB Platte.
 
Wie bekomme ich den jetzt aus dem cmd Script ein PowerShell Script ?

Ich weiß, dass es geht, die Frage ist nur wie. :D


Das Anzeigen klappt schon mal.

Code:
PS C:\> gwmi win32_logicaldisk -filter "drivetype=3" | select DeviceID,VolumeName,@{Name="Size";Expression ={"{0:N1}" -f ($_.Size/1gb)}},@{Name="FreeSpace";Expression={"{0:N1}" -f ($_.FreeSpace/1gb)}}

Die Frage nachdem wie bleibt aber noch.

Muss ja die einzelnen Server auslesen und nicht Lokale Platten.
 
Zuletzt bearbeitet:
Zurück
Oben