Ich suche also nach einem Kommandozeilenansatz, um einen kurzen (ish) Textauszug relativ niedriger Metadaten für eine Datei zu erhalten, etwa auf dieselbe Weise statwie auf * nix-Systemen.
Mit anderen Worten, Informationen, die über Win32- oder NT-Datei-APIs leicht verfügbar sind, ohne den Inhalt der Datei zu lesen und auf jeden Fall ohne sich in der Nähe der Shell befinden zu müssen (wie im Explorer und in den Dialogfeldern "Speichern / Öffnen" und bei allen anderen Anwendungen shell32.dll).
Unter NTFS würde diese Information tendenziell im MFT-Eintrag der Datei gespeichert werden, obwohl ich gehört habe, dass genau die Attribute, die in der MFT-Datei enden, weitgehend davon abhängen, zu welchem Teil sie passen wird, da viele Attribute optional und wiederholbar sind / oder variable Größe, einige können sein, obwohl es auch möglich ist, mehr als einen Slot in der MFT zu verwenden. (Tatsächlich ist es sogar möglich, den gesamten Inhalt einer Datei / eines Verzeichnisses in der MFT zu speichern, wenn die anderen Attribute nicht zu viel Platz beanspruchen!) Also, ähm, offensichtlich erscheint "in der MFT" nicht zur Definition was ich suche.
Außerdem suche ich nicht nach Tools, die NTFS selbst parsen oder nur mit NTFS-Dateisystemen arbeiten: Ich erwähne nur NTFS, denn welche lokale FS unterstützt mehr NT-spezifische Dinge?
Zur Verdeutlichung hier statdie Debian-Box, die ich als Router verwende:
An diesem Punkt war ich werde sagen, dass das „Geburt“ Zeitstempel - Feld ein Windowsism ist, aber das ist eindeutig nicht ganz richtig, weil Debians stat das Feld zeigt, nur dann ist es leer oben, weil das Dateisystem tatsächlich nicht das Feld hat. (Was zumindest klarer ist als die Zeitstempel "Access": Kein System aktualisiert diese auf herkömmliche strictatimeWeise.)
Beachten Sie auch, wie der Windows-Port Dateizugriffsberechtigungen anzeigt, eine unplausibel große "Inode-Nummer", und ich kann nur davon ausgehen, dass es sich auch um UID / GID-Nummern handelt (aufgrund der Verwendung von hierarchischen Bezeichnern mit variabler Länge Anstatt Zahlen mit fester Größe zu identifizieren, um Benutzer und Gruppen zu identifizieren, und erlaubt nicht gleichzeitig den Besitz von Benutzern und Gruppen, dh, unter NT befindet sich eine Datei im Besitz eines einzelnen Benutzers ODER einer Gruppe, und alle anderen Benutzer erhalten nur ihre Rechte von der ACL).
Bietet MS ein Instrument dieser Art, vermutlich eines, das aktuellere Informationen und weniger Märchenlandinformationen anzeigt?
Mein ursprünglicher Text folgt:
Ja, ich weiß, dass es Häfen von gibt stat, aber ( a ) ich befürchte, dass Informationen durch die Risse fallen könnten, wenn:
Es erscheint normalerweise nicht in der Unix- statAusgabe
Es fehlt aus statirgendeinem Code des Upstreams (falls vorhanden)
Der Portier (s) entweder
Beachten Sie nicht, dass Windows die Informationen bereitstellt
Bauen auf einer POSIX-Schicht auf, die sie nicht durchlässt
Sie sind sich nicht sicher, wie Sie die Informationen am besten im Kontext von präsentieren können (oder dass dies sogar angemessen ist) stat
Sie haben keine unbegrenzte Zeit zur Verfügung
und ( b ) ich habe mich gefragt, ob Microsoft irgendwelche analogen Werkzeuge geliefert hat.
Aber wirklich, jede Befehlszeilenmethode, die Informationen statliefert (unabhängig davon, ob es sich um ein aufgerufenes Programm handelt stat) könnte zusammen mit einer Beschreibung der mehr oder weniger NTFS-spezifischen Informationen, die es bereitstellt, von Interesse sein.
PS Ich bin unter Windows 7, aber lassen Sie sich davon nicht abhalten, Dinge zu erwähnen, die zuerst für / in späteren Versionen von Windows ausgeliefert wurden.
Mögliches Dupe: [Informationen zu einer Datei oder einem Verzeichnis] (https://superuser.com/q/242307)
DavidPostill vor 8 Jahren
1
Werfen Sie einen Blick auf http://ss64.com/vb/filesystemobject.html, wenn Sie eine Chance haben. Vielleicht finden Sie es auch hilfreich.
Pimp Juice IT vor 8 Jahren
0
Sehr geehrte Damen und Herren, wenn Sie denken, dass * meine * Frage zu weit gefasst ist, schauen Sie sich den DavidPostill-Link an: Er besteht aus vier Overt-Teilen, und zwei suchen nach Linux * - und * Windows 7-Antworten.
SamB vor 8 Jahren
0
Sowohl [WSL] (https://blogs.msdn.microsoft.com/wsl/2016/06/15/wsl-file-system-support/) als auch Cygwin verwenden [NTFS fileID] (https://stackoverflow.com/ q / 44162664/995714) als Inode-Nummer, die leicht zu überprüfen ist. Wenn wir 1970324836977201 in Hex konvertieren, erhalten Sie 0x7000000000A31, die nur über wenige gesetzte Bits verfügt. OTOH [* Bei Dateisystemen, die keine eindeutigen beständigen Datei-IDs (FAT, ältere Samba-Freigaben) unterstützen, wird die Inode-Nummer für eine Datei durch Hashing des vollständigen Win32-Pfads berechnet. *] (Http://cygwin.com/cygwin- ug-net / cygwin-ug-net.pdf)
phuclv vor 6 Jahren
0
Ich habe gerade ein PowerShell-Skript zusammengeschmissen. Es enthält so ziemlich alles, was für Windows sinnvoll ist, mit Ausnahme der Zugriffskontrollen, die normalerweise zu groß sind, um in eine Zusammenfassung zu passen. Sie können sie mit dem icaclsDienstprogramm sehen.
Es verwendet die normalen Eigenschaften des .NET / PowerShell-Dateisystems und ruft das fsutilHilfsprogramm für die kniffligen Dinge auf. Da es sich bei diesem Dienstprogramm nicht um ein PowerShell-Cmdlet handelt, musste ich einige unordentliche String-Hacks ausführen, um die richtigen Informationen zu erhalten.
Speichern Sie es als .ps1Datei und lesen Sie den Abschnitt Aktivieren von Skripts des PowerShell-Tag-Wikis . Beispiel für die Ausgabe:
Es gibt kein genaues Äquivalent, aber der nächstgelegenefsutil Befehl, den Sie mit den integrierten Windows-Dienstprogrammen erhalten können, ist der Befehl . Sie erhalten die meisten Funktionen und statdetailliertere Informationen zur zugrunde liegenden Dateisystemstruktur. Im Gegensatz statdazu muss es unter Administratorrechten ausgeführt werden. Sie können auch wmic (oder die Get-WmiObject( gwmiAlias) PowerShell-Version) für viele nützliche Daten verwenden. Für einige andere Optionen benötigen Sie andere Befehle
Im Folgenden erfahren Sie, wie Sie analoge Informationen zu den Formatoptionen instat (in PowerShell mit cmd-Version, falls verfügbar) erhalten, mit denen Sie die Ausgabe anpassen können. Ansonsten Dump nur die fsutil file layout, fsutil fsinfo sectorinfound fsutil fsinfo ntfsinfodirekt ausgegeben
Zugriffsrechte: Windows-Zugriffsrechte unterscheiden sich stark von POSIX-Zugriffsrechten. Daher gibt es keine Analoge zu % a . Es gibt jedoch ähnliche Informationen
Wenn Sie nur den Dateimodus soll dann entweder von diesen genügen und ist die am nächsten zu % A
(ls path\to\file).Mode for %i in (path\to\file) do echo %~ai in cmd
Anzahl der zugewiesenen Blöcke ( % b ): Führen Sie die Anzahl fsutil file layout path\to\fileoder fsutil volume filelayout path\to\filedie Anzahl der im $DATAStream zugewiesenen Cluster aus .
Für die folgende Ausgabe haben wir beispielsweise 4 Bereiche zugewiesen, die jeweils 82, 432,419, 259 und 155,076 Cluster lang sind. Folglich ist die Anzahl der zugewiesenen Blöcke 82 + 432419 + 259 + 155076 = 587836. Ein schneller Trick besteht darin, die VCN-Nummer des letzten Clusters mit seiner Länge hinzuzufügen: 432760 + 155076 = 587836
Die Größe in Bytes jedes Blocks, die von% b ( % B ) gemeldet wird :
fsutil fsinfo ntfsinfo <drive> | findstr /c:"Bytes Per Cluster"`
SELinux-Sicherheitskontextzeichenfolge ( % C ): Keine vergleichbare Funktion
Gerätenummer ( % d, % D ): Kein ähnliches Gegenstück. Sie können jedoch den folgenden Befehl verwenden, wenn Sie die Geräte-ID abrufen möchten
(Get-WmiObject win32_volume | where { $_.driveletter -eq '<drive>' }).deviceid
Rohmodus in Hex ( % f ): Keine äquivalente Form. Siehe% a /% A oben
Dateityp ( % F ): Keine direkte Entsprechung, da Windows-Datei- und Treibermodelle sehr unterschiedlich sind und es keine ähnlichen Zeichengeräte wie Windows gibt, so dass Sie keine "Character Special File" erhalten. Im Allgemeinen können Sie jedoch verwenden (ls path\to\file).Mode, um den Dateimodus wie oben% A (ls path\to\file).LinkTypezu erhalten, und um den Linktyp zu erhalten
Gruppenname des Eigentümers ( % G ):
(Get-Acl file.ext).Group
Gruppennummer des Besitzers ( % g ):
(gwmi win32_useraccount | where { $_.caption -eq "$((Get-Acl file.ext).Group)" }).SID
Anzahl der festen Links ( % h ): Es gibt keine ähnlichen Informationen. Es werden jedoch fsutil hardlink list path\to\filealle harten Links einer Datei gedruckt, sodass wir sie problemlos zählen können
(fsutil hardlink list path\to\file | Measure-Object).Count
Inode-Nummer ( % i ): Es gibt keinen Inode in Windows, aber NTFS (und möglicherweise neuere Dateisysteme wie ReFS) verfügen über eine entsprechende Datei-ID, die aus der fsutil file layoutAusgabe oder direkt mit extrahiert werden kann
fsutil file queryfileid path\to\file
Dateiname ( % n ): Dies ist ziemlich offensichtlich
Zitierter Dateiname mit Dereferenzierung bei symbolischem Link (% N):
oder dir path\to\filein cmd, mit dem symbolischen Namen in eckigen Klammern
E / A-Blockgröße ( % o ): Siehe % s für Dateisysteme unten
Gesamtgröße in Byte ( % s ): (ls path\to\file).Length. Oder kann leicht in der dirAusgabe von cmd und in der fsutil file layout path\to\fileAusgabe unter dem SizeFeld wie oben gesehen werden
Gerätetyp ( % t, % T ): Siehe % T für den Dateisystemtyp unten
Benutzername des Besitzers ( % U ):
(Get-Acl path\to\file).Owner
Benutzer-ID des Besitzers ( % u ): Sie können die Benutzer-SID mit dem folgenden Befehl abrufen
(gwmi win32_useraccount | where { $_.caption -eq "$((Get-Acl D:\zz.bat).owner)" }).SID
Dateizeit:
Letzte Zugriffszeit ( % x ):(ls path\to\file).LastAccessTime
So erhalten Sie die letzte Zugriffszeit seit Epoche ( % X ): (ls path\to\file).LastAccessTime.Ticksoder (ls path\to\file).LastAccessTime.ToFileTime()(abhängig von der gewünschten Epoche: 1/1/0001 oder 1/1/1601), um die Dateizeit in einer Auflösung von 100 ns zu erhalten
Ebenso kann der letzte Änderungszeitpunkt ( % y, % Y ) mit abgerufen werdenLastWriteTime
Für Dateisysteme können Sie im Allgemeinen fsutil fsinfo ntfsinfo <drive>oder verwenden fsutil fsinfo sectorinfo <drive>, um detaillierte Informationen zu erhalten
Für Nicht-Superuser verfügbare freie Blöcke ( % a ): Keine Entsprechung. Aber ich denke, du kannst es mit überprüfenfsutil quota query
Gesamtanzahl der Dateiknoten im Dateisystem ( % c ): Wenn es sich um die Anzahl der Inodes handelt, gibt es keine Begrenzung für MFT-Datensätze für NTFS sowie viele neuere Linux-Dateisysteme wie Btrfs oder XFS. Die MFT-Dateigröße wird erhöht, um mehr Dateisätze zu speichern. Die Gesamtzahl der MFT-Datensätze kann mit überprüft werdenfsutil fsinfo ntfsinfo <drive>
Freie Dateiknoten im Dateisystem ( % d ): Nicht sicher, was das ist. Wenn es sich um die Anzahl der nicht verwendeten Inodes handelt, gibt es, wie oben erwähnt, im Allgemeinen keine Obergrenze. fsutil volume allocationreport <drive>Wird möglicherweise funktionieren
Typ: Für % T können Sie verwenden fsutil fsinfo volumeinfo <drive> | findstr /c:"File System Name". Ich bin nicht sicher, was % t ist, aber es scheint, dass dies die magische Zahl der Partition ist
Die (Get-WmiObject win32_ALIAS | where { $_.FILTERFIELD -eq 'VALUE' }).GETFIELDobigen Befehle können in geändert werden wmic ALIAS where FILTERFIELD='VALUE' get GETFIELD /value. wmicWurde jedoch als veraltet eingestuft, kann es in Zukunft entfernt werden
1
bshacklett
Get-Item /path/to/file | Format-List Sie sollten nur das bekommen, was Sie brauchen, wenn Sie nur native Cmdlets verwenden.
Get-ItemRuft die Details zu allen Dateien ab, an denen Sie interessiert sind. Format-ListDadurch werden dem PowerShell-Host etwas unbeabsichtigt mehr Parameter verfügbar gemacht, als dies ansonsten der Fall wäre. Es formatiert sie auch als Liste, als Sie würden erwarten.
Wenn die Ausführlichkeit Sie stört, können Sie dies mit Aliasnamen verkürzen gi /path to file | fl
Es ist interessant zu beachten, dass auf Ihrem Computer `CreationTime == LastWriteTime` und auf meinem Computer` CreationTime == LastAccessTime` ist. Das lässt mich bezweifeln, dass * AccessTime * überhaupt Gültigkeit hat.
not2qubit vor 5 Jahren
0
0
Seth
Das Tool, das Sie verwenden, verwendet eine Umgebung, die als dünne Schicht zwischen Windows und Linux fungiert und bestimmte Elemente nachahmen muss, damit Linux-Tools ihre Aufgabe erfüllen können. Dies erklärt, warum es fabrizierte Informationen gibt, die (hoffentlich) in einer konsistenten Angelegenheit zusammenpassen. Sie müssen sich die Besonderheiten der Umgebung ansehen, die sie implementiert, um einen Sinn daraus zu machen.
Andererseits ist es (für mich) nicht genau klar, wonach Sie suchen. Wie Sie sagten, gibt es verschiedene APIs, die Sie nicht verwenden möchten. Ist nur die "emulierte" Information für Sie relevant?
Ansonsten benötigen Sie wahrscheinlich eine Reihe von Tools, um alle Informationen zu erhalten, die Sie benötigen. Zugriffsrechte und Zugriffssteuerungslisten sind meines Wissens nach sehr tief in NTFS verwurzelt. Tools wie diese icalcskönnten Ihnen helfen, Informationen zu den Zugriffsrechten auf Kommandozeile zu erhalten. Um genauere Informationen (für Teile davon) zu erhalten, sollten Sie WMI in Betracht ziehen, wie in diesem Beispiel gezeigt . Eine einfache diroder get-childitemvon einer PowerShell erhält Sie möglicherweise mehr Informationen zu den Erstellungszeiten und dergleichen. Ich kenne keine eingebauten Tools, mit denen Sie all diese Informationen aufgeben können. Möglicherweise verwenden Sie die Informationen zu den APIsund wickeln Sie sie in ein PowerShell-Skript ein. Dies könnte dem nahe kommen, was Sie eigentlich tun möchten. Ich bin mir nicht sicher, ob es ein Skript gibt, das das schon macht.
Ja, ich habe eine ungefähre Vorstellung davon, wie Windows-Ports von stat funktionieren. Es stellt sich heraus, dass MSYS2 verwendet wird. Zu dem, was ich wollte, war ich neugierig, ob MS bereits ein ungefähr analoges Tool gebaut hatte, vielleicht in einem ihrer vielen "Kits", oder dass es ein bekanntes Freeware-Tool von Drittanbietern gab. Und es ist nicht so, dass ich * mich * weigere *, APIs oder irgendetwas zu verwenden, es ist nur mehr Arbeit. (Wie auch immer, wenn das mein Ziel * wäre, hätte ich nach den APIs für SO gefragt.)
SamB vor 8 Jahren
0
Oder zumindest wäre SO der Ort gewesen, an dem ich nach den APIs gefragt hätte: Ich vermute, dass die Frage, die Sie verlinkt haben, [Was ist lstat () Alternative in Windows?] (Http://stackoverflow.com/questions/ 12085761 / what-is-lstat-alternative-in-windows) wäre mir aufgefallen, als ich an meinem Titel arbeitete, wenn nicht vorher. (Huh, das Feature "Titel einer verknüpften Frage anzeigen" funktioniert nicht nur in Kommentaren, anscheinend auch nicht mit der `<>" - Notation?).
SamB vor 8 Jahren
0
... obwohl es nicht so gut beantwortet ist ...
SamB vor 8 Jahren
0