panguu
Goto Top

Speichernutzung eines Windows Domänenbenutzers analysieren

Hallo zusammen,

folgendes Szenario: Linux fileserver auf Basis Samba4 mit aktivierter Kontigentbeschränkung (quota) auf filesystems /srv/freigaben. In Samba4 gibt es diverse Freigaben, physikalisch liegt alles unterhalb dieses filesystem, also z.B.

Freigabe --> Ort auf dem Linux filesystem

Foo --> /srv/freigaben/foo
Bar --> /srv/freigaben/bar
Homes --> /srv/freigaben/homes
Public --> /srv/freigaben/public
Marketing --> /srv/freigaben/marketing
usw.

Quotas sind eingerichtet und funktionieren auch soweit. Das Problem bzw. meine Frage ist: welche Möglichkeit hat ein standard Windows-Domänenbenutzer (=Mitarbeiter) herauszufinden, wo überall er Dateien auf diesem Server liegen hat. Alle Dateien, dessen Besitzer/Eigentümer ist werden ja zu seinem Quota dazugerechnet. Manuell und mit etwas Eigenrecherche kann ich auf dem Linux fileserver manuell alle Dateien des Benutzer "mustermann" rausfischen mit "find" und "awk" in einem one-liner aber das Ziel soll es sein, dass der Mitarbeiter das selbst anzeigen lassen kann. Er hat mehrere Ordner und Dateien quer durch alle verfügbaren Freigaben verteilt, möchte Platz schaffen (alte Daten aufräumen, komprimieren, löschen, ...) und weiß aber nicht wie er all "seine" Dateien findet.

Hat jemand einen Tip?

Content-ID: 521234

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

Ausgedruckt am: 21.11.2024 um 17:11 Uhr

141965
141965 02.12.2019 aktualisiert um 15:40:50 Uhr
Goto Top
Powershell Einzeiler am Client, ansonsten kannst du ja auch ne PHP-Seite basteln die es dem User auf ner Webseite präsentiert.
Get-ChildItem "\\SERVER\Share" -Recurse -File -Force -EA SilentlyContinue | ?{$_.GetAccessControl().GetOwner([System.Security.Principal.NTAccount]).Value -eq "$env:USERDOMAIN\$env:USERNAME"} | sort Length -Desc | select @{n='Größe(MB)';e={"{0:F2}" -f ($_.Length / 1MB)}},LastWriteTime,Fullname | ogv  
panguu
panguu 02.12.2019 um 20:13:08 Uhr
Goto Top
Wow, danke erstmal auch wenn noch ungetestet. Das Problem ist nur wie ich *alle* Freigaben da miteinbeziehen kann? Sagen wir es gibt 35 Freigaben auf dem Server, dann müsste ich diesen Einzeiler 35x getrennt ausführen, ist irgendwie doof. Wenn man statt "\\SERVER\Share" einfach "\\SERVER" nimmt, dann wird das ganz bestimmt nicht funktionieren da er ja nicht weiß, welche shares denn vorhanden sind. Eventuell vorher eine Abfrage aller verfügbaren Shares und das Ergebnis als Schleife in diesen Einzeiler speisen, ginge das?
141965
141965 02.12.2019 aktualisiert um 22:06:55 Uhr
Goto Top
Klar einfach ne Schleife über Win32_Share drum pappen
gwmi Win32_Share -Computer xyz
panguu
panguu 03.12.2019 aktualisiert um 09:26:13 Uhr
Goto Top
wenn ich den Befehl "gwmi Win32_Share -Computer 192.168.0.100" absetze dann erhalte ich diese Fehlermeldung:

gwmi : Der RPC-Server ist nicht verfügbar.
In Zeile:1 Zeichen:1

back-to-topgwmi Win32_Share -Computer 192.168.0.100

back-to-top~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : InvalidOperation: (face-smile [Get-WmiObject], COMException
+ FullyQualifiedErrorId : GetWMICOMException,Microsoft.PowerShell.Commands.GetWmiObjectCommand

habe es mit Hostname probiert, FQDN und auch mit IP-Adresse. Immer dieselbe Fehlermeldung.


Und was bedeuten diese Fehlermeldungen in der Powershellausgabe nach dem Absetzen des Kommandos aus deinem ersten Post? Die erscheinen nicht sofort, sondern während dem Abarbeiten sporadisch. Manchmal krieg ich dann auch gar kein Ausgabefenster mit dem Ergebnis.

Ausnahme beim Aufrufen von "GetAccessControl" mit 0 Argument(en): "Ungültiger Name.
Parametername: name"
In Zeile:1 Zeichen:84

back-to-top... ontinue | ?{$_.GetAccessControl().GetOwner([System.Security.Principal ...

back-to-top~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : NotSpecified: (face-smile [], MethodInvocationException
+ FullyQualifiedErrorId : ArgumentException

Ausnahme beim Aufrufen von "GetAccessControl" mit 0 Argument(en): "Ungültiger Name.
Parametername: name"
In Zeile:1 Zeichen:91

back-to-top... ontinue | ?{$_.GetAccessControl().GetOwner([System.Security.Principal ...

back-to-top~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : NotSpecified: (face-smile [], MethodInvocationException
+ FullyQualifiedErrorId : ArgumentException

manchmal steht "in Zeile:1 Zeichen:91" manchmal trägt die Fehlermeldung Zeichen:84
141965
141965 03.12.2019 aktualisiert um 10:29:55 Uhr
Goto Top
Dann ist wohl die Firewall des Servers komplett dicht, und die WMI Ausnahme ist nicht gegeben.
$server = 'SERVERXY'  
gwmi win32_Share -Computer $server | ?{$_.Type -eq 0 -and $_.Name -notmatch '\$$'} | %{  
    Get-ChildItem "\\$server\$($_.Name)" -Recurse -File -Force -EA SilentlyContinue | ?{$_.GetAccessControl().GetOwner([System.Security.Principal.NTAccount]).Value -eq "$env:USERDOMAIN\$env:USERNAME"} | sort Length -Desc | select @{n='Größe(MB)';e={"{0:F2}" -f ($_.Length / 1MB)}},LastWriteTime,Fullname  
} | ogv
Geht hier einwandfrei
panguu
panguu 03.12.2019 aktualisiert um 14:42:55 Uhr
Goto Top
hmmm... schon der Befehl

gwmi Win32_Share -Computer samba4server

läuft auf die genannte Fehlermeldung

gwmi : Der RPC-Server ist nicht verfügbar.
In Zeile:1 Zeichen:1

back-to-topgwmi Win32_Share -Computer samba4server

back-to-top~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

+ CategoryInfo : InvalidOperation: (face-smile [Get-WmiObject], COMException
+ FullyQualifiedErrorId : GetWMICOMException,Microsoft.PowerShell.Commands.GetWmiObjectCommand
141965
Lösung 141965 03.12.2019 aktualisiert um 14:53:58 Uhr
Goto Top
Uups ist ja ein Samba-Server der hat ja kein WMI da geht das natürlich nicht. Dann musst du die Shares auf andere Art auslesen (z.B. über "net view") oder im Skript definieren.
$server = 'SERVERXYZ'  
net view $server | ?{$_ -match 'Platte'} | %{($_ -split '\s+')} | %{  
    Get-ChildItem "\\$server\$_" -Recurse -File -Force -EA SilentlyContinue | ?{$_.GetAccessControl().GetOwner([System.Security.Principal.NTAccount]).Value -eq "$env:USERDOMAIN\$env:USERNAME"} | sort Length -Desc | select @{n='Größe(MB)';e={"{0:F2}" -f ($_.Length / 1MB)}},LastWriteTime,Fullname  
} | ogv
panguu
panguu 05.12.2019 um 11:27:32 Uhr
Goto Top
Vielen herzlichen Dank!

bis auf die Fehlermeldungen, die aufpoppen scheint das zu funktionieren. Er geht dabei jeden Share durch und listet das im Ausgabefenster auf. Kann das sein, dass die Fehlermeldung deswegen erscheint, weil der jeweilige User evtl. die Berechtigungen eines Objekts gar nicht auflisten/anzeigen darf und somit nicht entscheiden kann ob er der Besitzer ist?

Falls ja, kann man diese Fehlermeldung unterdrücken, damit die nicht das Powershellfenster zumüllen? Also so etwas wie 2>/dev/null aus der Linuxwelt ?
141965
141965 05.12.2019 um 12:44:15 Uhr
Goto Top
Ja, beschäftige dich mal mit try .... Catch