So erfassen Sie Windows-Benutzerprofile mit PowerShell

So erfassen Sie Windows-Benutzerprofile mit PowerShell

Veröffentlicht am August 09, 2017 0 Comments

how-to-accurately-enumerate-windows-user-profiles-with-powershell.jpg

Wenn Sie versuchen, alle Profile aufzulisten, benötigen Sie ein Skript, das eine Vielzahl von Szenarien berücksichtigen kann.

Eine alltägliche Aufgabe, die viele Administratoren bei der Arbeit mit Windows Server- und Client-Betriebssystemen ausführen müssen, ist das Auflisten aller Benutzerprofile. Das Profil eines Benutzers ist der übliche Ort, an dem jede installierte Anwendung und auch Windows selbst Dateien und Ordner ablegt, die für einen bestimmten Benutzer bestimmt sind. Wenn ein Administrator einzelne Dateien für alle Benutzer über ein Skript entfernen, hinzufügen oder ändern muss, besteht die übliche Reaktion darin, alle Ordner in C:\Users aufzuzählen. Da C:\Users der Speicherort für die meisten Benutzer ist, reicht es aus, jeden dieser Ordner zu identifizieren. Was aber, wenn wir alle Profile auflisten müssen, einschließlich derjenigen, die SYSTEM, Network Service und anderen betriebssystemspezifischen Profilen gehören? Oder was passiert, wenn wir mit Windows XP arbeiten und die Profile stattdessen in C:\Dokumente und Einstellungen gespeichert sind? Wir brauchen ein Skript, das alle diese Szenarien berücksichtigt.

Um ein robusteres Skript zum Auflisten von Benutzerprofilen zu erstellen, können wir nicht einfach alle Ordner in C:\Users auflisten. Wir müssen einen Ort abfragen, der immer auf alle Benutzerprofile auf einem System verweist, und dafür müssen wir die Registrierung aufsuchen.

Lesen: Arbeiten mit Windows-Diensten in PowerShell

Die Registrierung enthält einen Schlüssel namens ProfileList, der sich in HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion befindet. Dieser Registrierungsschlüssel enthält einen Unterschlüssel für jedes Benutzerprofil auf einem Windows-Rechner. In jedem dieser Unterschlüssel befindet sich ein Registrierungswert namens ProfileImagePath, der den Profilpfad für alle Benutzer enthält.

Sobald wir diesen Speicherort kennen, müssen wir herausfinden, wie wir PowerShell dazu bringen können, alle diese Werte aufzuzählen. Da PowerShell bereits über einen integrierten Registrierungsanbieter verfügt, können wir Get-ChildItem verwenden, um all diese Unterschlüssel aufzuzählen. Wie Sie unten sehen können, habe ich neben den Standard-Systemprofilen nur einen einzigen Adam-Benutzer auf meinem System.

PS> Get-ChildItem 'HKLM:\Software\Microsoft\Windows NT\CurrentVersion\ProfileList'


    Hive: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\ProfileList


Name                           Property
----                           --------
S-1-5-18                       Flags            : 12
                               ProfileImagePath : C:\Windows\system32\config\systemprofile
                               RefCount         : 1
                               Sid              : {1, 1, 0, 0...}
                               State            : 0
S-1-5-19                       ProfileImagePath : C:\Windows\ServiceProfiles\LocalService
                               Flags            : 0
                               State            : 0
S-1-5-20                       ProfileImagePath : C:\Windows\ServiceProfiles\NetworkService
                            Flags            : 0
                               State            : 0
S-1-5-21-3385963305-808838737- ProfileImagePath                        : C:\Users\defaultuser0
1911667508-1000                Flags                                   : 0
                               State                                   : 0
                               Sid                                     : {1, 5, 0, 0...}
                               ProfileAttemptedProfileDownloadTimeLow  : 0
                            ProfileAttemptedProfileDownloadTimeHigh : 0
                               ProfileLoadTimeLow                      : 0
                               ProfileLoadTimeHigh                     : 0
                               RefCount                             : 0
                               RunLogonScriptSync                      : 0
S-1-5-21-3385963305-808838737- ProfileImagePath                        : C:\Users\Adam
1911667508-1002                Flags                                : 0
                               State                                   : 0
                               Sid                                     : {1, 5, 0, 0...}
                               ProfileAttemptedProfileDownloadTimeLow  : 0
                               ProfileAttemptedProfileDownloadTimeHigh : 0
                               ProfileLoadTimeLow                      : 0
                               ProfileLoadTimeHigh                     : 0
                               RefCount                                : 15
                               RunLogonScriptSync                      : 0
Die Möglichkeit, diese Profile zu sehen, ist ein Anfang, aber wir müssen die spezifischen Ordnerpfade irgendwo in unserem Skript verwenden. Dafür müssen wir nur die Werte von ProfileImagePath für jeden Benutzer sehen. Um den Registrierungswert für jeden Unterschlüssel des Benutzers zurückzugeben, rufen wir die Methode GetValue() für jeden Registrierungsschlüssel auf, um nur den Pfad des Benutzerprofils zu sehen.
PS> Get-ChildItem 'HKLM:\Software\Microsoft\Windows NT\CurrentVersion\ProfileList' | ForEach-Objekt { $_. GetValue('ProfileImagePath') }
C:\Windows\system32\config\systemprofile
C:\Windows\ServiceProfiles\LocalService
C:\Windows\ServiceProfiles\NetworkService
C:\Benutzer\defaultuser0
C:\Benutzer\Adam

Indem Sie jeden Registrierungsschlüssel mit ForEach-Object in einer Schleife durchlaufen und dann die GetValue()-Methode für jeden ProfileImagePath-Wert aufrufen, werden jetzt nur die Pfade zurückgegeben, nach denen wir suchen. Sobald Sie die Pfade zu jedem Benutzerprofil haben, können zusätzliche Überprüfungen oder Codes für jeden Ordner durchgeführt werden. Beispielsweise befindet sich der Pfad des temporären Ordners jedes Benutzers im Ordner AppData\Local\Temp. Um den temporären Ordner jedes Benutzers aufzulisten, können Sie einen Befehl in Ihrer Schleife hinzufügen, um diese Dateien aufzulisten.

PowerShell PS> Get-ChildItem 'HKLM:\Software\Microsoft\Windows 
NT\CurrentVersion\ProfileList' | ForEach-Object {      $profilePath =
$_.GetValue('ProfileImagePath')     Get-ChildItem -Path
"$profilePath\AppData\Local\Temp" }

Sobald Sie eine Schleife haben, die jeden Benutzerprofilpfad enthält, können Sie alles mit den Dateien und Ordnern innerhalb dieser Pfade machen, was Sie wollen!

Lesen Sie auch unser E-Book: Automatisieren mit PowerShell

Adam Bertram

Adam Bertram is a 20-year veteran of IT. He’s currently an automation engineer, blogger, independent consultant, freelance writer, author, and trainer. Adam focuses on DevOps, system management, and automation technologies as well as various cloud platforms. He is a Microsoft Cloud and Datacenter Management MVP and efficiency nerd that enjoys teaching others a better way to leverage automation.

Kommentare

Comments are disabled in preview mode.
Themen

Sitefinity-Schulungen und -Zertifizierungen jetzt verfügbar.

Lassen Sie sich von unseren Experten beibringen, wie Sie die erstklassigen Funktionen von Sitefinity nutzen können, um überzeugende digitale Erlebnisse zu bieten.

Weitere Informationen

Abonnieren Sie, um alle Neuigkeiten, Informationen und Tutorials zu erhalten, die Sie benötigen, um bessere Business-Apps und -Websites zu erstellen

Loading animation