none
User Profile löschen RRS feed

  • Frage

  • Hallo,

    ich wende mich mal wieder an euch da ich nicht der Programmierer bin. Ich versuche es immer wieder aber irgendwie fehlt mir das Verständnis dafür. Ich möchte zu erst einmal wissen ob das was ich vorhabe sich überhaupt umsetzen lässt.

    Wir haben des Öfteren das Problem das User auf den Terminal Servern (Citrix Umgebung) mit einem temp. Profilen angemeldet werden.

    Dann müssen wir hergehen und zum einen alle Terminal Server untersuchen ob dort noch Profilreste liegen und dann anschließend das Profil des Users löschen.

    Nun würde ich gerne ein Script bauen das mir alle ca. 40 Terminal Server abgrast "\\Terminal Server\c$\users\" und nach einem bestimmten user "user Name" sucht und das gefundene nach Bestätigung löscht. In zweiten Schritt soll das Script dann das User Profil des users in einem bestimmten Verzeichnis suchen und nach Bestätigung löschen.

    Als Kür würde ich das ganze gerne in eine kleine Maske bringen so das unser Anwender Support das Script startet, den User namen in die Maske eingibt und dann nur noch die Abfragen bestätigen muss.

    Vielleicht könnt ihr mir etwas Hilfestellung geben ob dies so überhaupt geht und dann würde ich gerne versuchen dies mit Eurer Hilfe umzusetzen.

    Viel Dank

    Michael

    Donnerstag, 16. März 2017 09:16

Antworten

  • > Vielleicht könnt ihr mir etwas Hilfestellung geben ob dies so überhaupt geht und dann würde ich gerne versuchen dies mit Eurer Hilfe umzusetzen.
     
    Klar geht das :-)
     
    Step 1: Ermitteln aller Terminal Server - entweder aus einer OU oder aus einer Gruppe
    Step 2: Iterieren über diese Server. Userprofile löschen geht am einfachsten über Win32_UserProfile:
     
    [array]$users = Get-WmiObject -ComputerName $computer Win32_UserProfile -filter "LocalPath Like 'C:\\Users\\%'" -ea stop
     
    Du kannst bei Get-WMIObject den Remote-COmputer angeben. Oder Du machst nicht WMI-Remoting, sondern PS-Remoting.
     
    Und dann halt löschen: ($users[$account]).Delete()
     
    Der Rest ist "Schleifchen und Glöckchen" :-))
     
     
    • Als Antwort vorgeschlagen Florian Haupt Freitag, 17. März 2017 09:23
    • Als Antwort markiert Better_M Dienstag, 21. März 2017 14:29
    Donnerstag, 16. März 2017 09:51

Alle Antworten

  • > Vielleicht könnt ihr mir etwas Hilfestellung geben ob dies so überhaupt geht und dann würde ich gerne versuchen dies mit Eurer Hilfe umzusetzen.
     
    Klar geht das :-)
     
    Step 1: Ermitteln aller Terminal Server - entweder aus einer OU oder aus einer Gruppe
    Step 2: Iterieren über diese Server. Userprofile löschen geht am einfachsten über Win32_UserProfile:
     
    [array]$users = Get-WmiObject -ComputerName $computer Win32_UserProfile -filter "LocalPath Like 'C:\\Users\\%'" -ea stop
     
    Du kannst bei Get-WMIObject den Remote-COmputer angeben. Oder Du machst nicht WMI-Remoting, sondern PS-Remoting.
     
    Und dann halt löschen: ($users[$account]).Delete()
     
    Der Rest ist "Schleifchen und Glöckchen" :-))
     
     
    • Als Antwort vorgeschlagen Florian Haupt Freitag, 17. März 2017 09:23
    • Als Antwort markiert Better_M Dienstag, 21. März 2017 14:29
    Donnerstag, 16. März 2017 09:51
  • schau dir bitte auch das delprof2 an. das ist einfach zu bedienen (Einzeiler) und erfüllt vermutlich deine Anforderungen.

     https://helgeklein.com/free-tools/delprof2-user-profile-deletion-tool/

    ich nutze es immer wieder gerne.


    Chris

    Donnerstag, 16. März 2017 20:09
  • Ja. Im Grunde suche ich genau so etwas. Was mir nur fehlt ist:

    - Wie kann ich über alle 40 Server suchen?

    - Wie kann ich nach einem bestimmten Anwender suchen?

    Unser Problem ist einfach das gelegentlich Profile nicht sauer zurück geschrieben werden und nach dem Abmelden nicht sauber gelöscht werden. Ich glaube aber das ist ein allgemeines Problem in einer TS Farm.
    • Bearbeitet Better_M Freitag, 17. März 2017 07:43
    Freitag, 17. März 2017 07:40
  • in einem Schulungsraum mache ich es so, da alle User mit 88 beginnen

    "\\nts\LogonTools\DelProf2.exe" /q /id:88*

    Auf einem Terminalserver kannst du es mittels Schedule Task machen


    Chris

    Freitag, 17. März 2017 08:04
  • das gratis psexec könnte dir auch noch helfen wenn des es remote (auf anderen Servern) ausführen möchtest.

    https://technet.microsoft.com/de-de/sysinternals/bb897553.aspx


    Chris

    Freitag, 17. März 2017 08:12
  • Ja, aber das ist nicht ganz das was ich machen möchte.

    Ich möchte in einem Arbeitsschritt auf allen Terminal Servern nach einem bestimmten Profil suchen und wenn es auf einem Server vorhanden ist nach Bestätigung löschen.

    Von daher ist der Ansatz des Tools klasse. Ich muss es nur hinbekommen das das Tool nach einem bestimmten Profil über alle Server sucht und dann löscht. Ich möchte nicht in einer Batchdatei die Zeile x-mal eintragen.

    Freitag, 17. März 2017 09:03
  • hmmm ... aber Grundkenntnisse in Powershell hast Du, oder? Wir können Dir keine fertigen Scripte liefern - Du musst schon ein bissl mitmachen!  ;-)

    Wie Du eine Liste von Profile auf einem remote Server bekommst, hatte Dir Martin oben ja schon gezeigt. Du musst ja jetzt nur noch die Liste Deiner Terminal Server durchhächeln und schauen, ob das von Dir gesuchte Userprofil dabei ist ... so ungefähr:

    $ServerListe = 'Server1','Server2','Server3','Server4','Server5','Server6'
    Foreach($Server in $ServerListe){
        #  ... Supi Dupi Code für jeden einzelnen $Server
    }

    Wie Du Code bedingungsabhängig ausführst, sollte (hoffentlich) klar sein. 

    Fand doch erst mal an, Dir die gesuchten Informationen anzeigen zu lassen ... ich mein bevor Du richtig Daten löschst.  ;-)


    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''

    Freitag, 17. März 2017 09:52
  • Ihr sollt mir doch auch keine fertigen Scripte liefern "wäre doch super ;) " dann lerne ich doch nichts. Bei uns wird halt kaum etwas mit PS gemacht. Die letzten Posts bezogen sich nur auf das Tool. Ware doch super gewesen wenn ich mein Ziel damit einfach hätte erreichen können. Aber Schertz bei Seite.

    Ich setzte mich doch schon mit dem Vorschlag vom Martin auseinander. Es dauert halt nur etwas wenn keine Routine und Übung da ist. Außerdem läuft so etwas nur neben her.

    Freitag, 17. März 2017 10:08
  • > Wir können Dir keine fertigen Scripte liefern
     
    Können täten wir schon können, bloß wollen tun wir nicht :))
     
    Freitag, 17. März 2017 12:17
  • Okay. Also ich habe jetzt einfach mal angefangen und folgendes zusammen geschrieben:

        [array] $Computers = "Computer1","Computer2","Computer3" 
        $log = "\\server\share\log.txt" 
        $date = Get-Date 
    
    ForEach ($computer in $Computers) { 
            Try{ 
                [array]$users = Get-WmiObject -ComputerName $computer Win32_UserProfile -filter "LocalPath Like 'C:\\Users\\%'" -ea stop   
                }     
            Catch {   
                 Write-Warning "$($error[0]) "   
                Break   
                }}     

    Wenn ich den Code ausführe bekomme ich folgende Medung: 

    WARNUNG: Die Anfrage ist ungültig. "select * from Win32_UserProfile where LocalPath Like 'C:\\Users\\%'" 

    Selbstverständlich habe ich "Computer 1 usw. " gegen einen Server aus unserer Umgebung ersetzt.

    Freitag, 17. März 2017 12:20
  • >             [array]$users = Get-WmiObject -ComputerName $computer Win32_UserProfile -filter "LocalPath Like 'C:\\Users\\%'" -ea stop
    > WARNUNG: Die Anfrage ist ungültig. "select * from Win32_UserProfile where LocalPath Like 'C:\\Users\\%'"
     
    Ich weiß net, was bei Dir anders ist - bei mir funktioniert das...
     
    Freitag, 17. März 2017 12:59
  • Bei mir genau so. Bist Du Dir sicher, dass Du den Code so ausführst, wie Du ihn hier postest? 

    Meistens ist es hilfreich, die GANZE Fehlermeldung zu posten (einfach auch als Code formatieren - dann kann man's besser lesen)


    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''

    Freitag, 17. März 2017 13:01
  • Bei mir genau so. Bist Du Dir sicher, dass Du den Code so ausführst, wie Du ihn hier postest? 

    Meistens ist es hilfreich, die GANZE Fehlermeldung zu posten (einfach auch als Code formatieren - dann kann man's besser lesen)


    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''

    Das ist das Script. Ich habe nur die Servernamen zum posten neutralisieret.

    Das hatte ich dem Script vorweg geschickt.

    Set-ExecutionPolicy -ExecutionPolicy Bypass -Force
    Import-Module ActiveDirectory
    [array] $Computers = "xx-xxxx-xxxx20","xx-xxxx-xxxx21","xx-xxxx-xxxx29" 
        $log = "\\server\share\log.txt" 
        $date = Get-Date 
    ForEach ($computer in $Computers) { 
               Try{ 
                [array]$users = Get-WmiObject -ComputerName $computer Win32_UserProfile -filter "LocalPath Like 'C:\\Users\\%'" -ea stop   
                }     
            Catch {   
                 Write-Warning "$($error[0]) "   
                Break   
                }}
    Das ist die Ausgabe wenn ich im PS ISE das Script ausführe (F5)
    PS C:\Windows\system32>     [array] $Computers = "xx-xxxx-xxxx20","xx-xxxx-xxxx21","xx-xxxx-xxxx29" 
        $log = "\\server\share\log.txt" 
        $date = Get-Date 
    ForEach ($computer in $Computers) { 
               Try{ 
                [array]$users = Get-WmiObject -ComputerName $computer Win32_UserProfile -filter "LocalPath Like 'C:\\Users\\%'" -ea stop   
                }     
            Catch {   
                 Write-Warning "$($error[0]) "   
                Break   
                }}     
    WARNUNG: Die Anfrage ist ungültig. "select * from Win32_UserProfile where LocalPath Like 'C:\\Users\\%'" 
    
    PS C:\Windows\system32> 

    Freitag, 17. März 2017 13:15
  • hmmm ... muss wohl an Deiner Umgebung liegen. Hast Du die Möglichkeit, das Script mal von einem anderen PC oder Server zu starten?

    ... und übrigens: Wenn Du keine AD-cmdlets benutzt, brauchst Du das AD-Modul auch nicht vorher zu importieren. Seit Powershell 3 werden benötigte Module sowieso automatisch nachgeladen.


    Grüße - Best regards

    PS:> (79,108,97,102|%{[char]$_})-join''

    Freitag, 17. März 2017 13:29
  • Ja, allerdings erst ab Montag. Ich melde mich dann am Montag wieder. Schönes WE.
    Freitag, 17. März 2017 13:35
  • > WARNUNG: Die Anfrage ist ungültig. "select * from Win32_UserProfile where LocalPath Like 'C:\\Users\\%'"
     
    Ahem - unter welchem OS laufen denn die Server, die Du da so abklapperst?
     
    Freitag, 17. März 2017 13:47
  • W2K8 R2
    Freitag, 17. März 2017 14:15
  • > W2K8 R2
     
    Ok - dann weiß ich leider immer nicht, woran es liegt. Win32_UserProfile wurde mit 2008 eingeführt. Kannst Du lokal auf einem der Server mal in ner Commandline
    wmic path win32_userprofile
    eintippern?
     
    Freitag, 17. März 2017 15:28
  • Okay. Neue Woche, neues Glück.

    Also im Grunde arbeiten wir alle auf den Terminal Servern da wir ca. 90% auf Citrix umgestellt haben. Somit setze ich eigentlich auch die PS Befehle auf einem TS ab. Ich selbst gehöre mit zur Gruppe der Domain Admins, von daher denke ich nicht das es an den Rechten liegt. Ich dachte das es vielleicht an der Remote Abfrage liegen würde und habe das Script so angepasst das nur der Server, auf dem ich aktuell arbeite abgefragt wird. Bringt das gleiche Ergebnis / Fehlermeldung.

    Daher habe ich das o.g. Komando auf dem aktuellen TS ausgeführt. Hier das  Ergebnis:

    LastDownloadTime  LastUploadTime  LastUseTime                Loaded  LocalPath                                  RefCount  RoamingConfigured  RoamingPath  RoamingPreference  SID                                            Special  Status  
                                      20170320062545.868000+000  TRUE    C:\Users\xxxxxx                            1         FALSE                                              S-1-5-21-66538259-1857230727-1563503735-9279   FALSE    0       
                                      20170315073740.148000+000  FALSE   C:\Users\xxxxxx                            0         FALSE                                              S-1-5-21-66538259-1857230727-1563503735-8999   FALSE    0       
                                      20170320062845.953000+000  TRUE    C:\Users\xxxxxx                            1         FALSE                                              S-1-5-21-66538259-1857230727-1563503735-8866   FALSE    0       
                                      20170320062245.420000+000  TRUE    C:\Users\xxxxxx                            1         FALSE                                              S-1-5-21-66538259-1857230727-1563503735-18234  FALSE    0       
                                      20170320062745.889000+000  TRUE    C:\Users\xxxxxx                            1         FALSE                                              S-1-5-21-66538259-1857230727-1563503735-17764  FALSE    0       
                                      20170314043252.637000+000  TRUE    C:\Users\xxxxxx                            1         FALSE                                              S-1-5-21-66538259-1857230727-1563503735-16364  FALSE    0       
                                      20170320062945.998000+000  TRUE    C:\Users\xxxxxx                            1         FALSE                                              S-1-5-21-66538259-1857230727-1563503735-13269  FALSE    0       
                                      20170317142934.192000+000  TRUE    C:\Users\xxxxxx                            1         FALSE                                              S-1-5-21-66538259-1857230727-1563503735-13143  FALSE    0       
                                      20170320062345.441000+000  TRUE    C:\Users\xxxxxx                            1         FALSE                                              S-1-5-21-66538259-1857230727-1563503735-12306  FALSE    0       
                                      20170320063046.041000+000  TRUE    C:\Users\xxxxxx                            1         FALSE                                              S-1-5-21-66538259-1857230727-1563503735-11354  FALSE    0       
                                      20170320062145.249000+000  TRUE    C:\Users\xxxxxx                            1         FALSE                                              S-1-5-21-66538259-1857230727-1563503735-11353  FALSE    0       
                                      20170222072004.978000+000  FALSE   C:\Users\Administrator                     0         FALSE                                              S-1-5-21-1146670167-4014418160-492615652-500   FALSE    0       
                                      20170314044524.576000+000  TRUE    C:\Users\Ctx_StreamingSvc                  1         FALSE                                              S-1-5-21-1146670167-4014418160-492615652-1001  FALSE    0       
                                      20170314054811.743000+000  TRUE    C:\Windows\ServiceProfiles\NetworkService            FALSE                                              S-1-5-20                                       TRUE     0       
                                      20170320060443.226000+000  TRUE    C:\Windows\ServiceProfiles\LocalService              FALSE                                              S-1-5-19                                       TRUE     0       
                                      20140820090213.280000+000  TRUE    C:\Windows\system32\config\systemprofile   1         FALSE                                              S-1-5-18                                       TRUE     0       

    Ich würde sagen, das sieht gut aus.

    Ich habe auch noch einmal die PS Version abgefragt die auf dem TS Server installiert ist.

    Name                           Value                                                                                                                                  
    ----                           -----                                                                                                                                  
    PSVersion                      4.0                                                                                                                                    
    WSManStackVersion              3.0                                                                                                                                    
    SerializationVersion           1.1.0.1                                                                                                                                
    CLRVersion                     4.0.30319.18444                                                                                                                        
    BuildVersion                   6.3.9600.16406                                                                                                                         
    PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0}                                                                                                                   
    PSRemotingProtocolVersion      2.2                


    • Bearbeitet Better_M Montag, 20. März 2017 14:15
    Montag, 20. März 2017 06:51
  • > Ich würde sagen, das sieht gut aus.
     
    Ja, tut es. Win32_UserProfile hat also kein Problem.
     
    > WARNUNG: Die Anfrage ist ungültig. "select * from Win32_UserProfile where LocalPath Like 'C:\\Users\\%'"
     
    Nähern wir uns der Sache mal langsam... Geht das hier?
    gwmi -query "select localpath from win32_userprofile where localpath like ""%"""
     
    Dann ist es möglicherweise nur ein Copy/Paste-Problem... Tipp das mal "frisch" ab.
     
    Montag, 20. März 2017 16:04
  • Grundsätzlich sollten die genannten Profil-Probleme erst gar nicht auftreten. Benutzt ihr das Standard-Microsoft Profile-Management oder Citrix Profile Management (alias UPM)?
    Wenn UPM -> Welche Version? Wir hatten da im Vorjahr auch Probleme die schlußendlich ab Version 5.5? gefixt wurden. (siehe ChangeLog)

    Ansonsten ist die Information "Citrix" allein etwas dürftig. Was wird genau eingesetzt?
    XenApp bringt seine eigenen Powershell-Module, mit denen du beispielsweise die XA-Hosts deiner Farm easy herausbekommst.

    Wie gesagt hatten wir im Vorjahr Profil-Probleme. (Stale-Profiles wg. File-Locks)
    Die Symptome konnte ich zeitweilen ganz gut mit dem genannten delprof2 bekämpfen.

    In den absoluten Grundzügen hat das Script dann etwa so ausgesehen (aus dem Bauch heraus ...):

    Add-PSSnapin Citrix*
    
    $DelProfExecutable = Join-Path -Path $PathToExe  -ChildPath DelProf2.exe
    $Servers = Get-XAServer -ZoneName "MyZone" -OnlineOnly | Select-Object -ExpandProperty ServerName | Sort-Object ServerName
    
    foreach ( $Server in $Servers ) {
    
        & $DelProfExecutable /c:$Server /l /..........
    
    }

    Mit einem anderen Command könntest du auch die Hosts einer gewünschten Workergruppe herausfiltern.

    Die verwendeten Citrix-CmdLets sind für XenApp 6.5. Unter XenApp 7.x sieht das ganze dann wieder ein bißchen anders aus. Geht aber auch ...

    Meiner Meinung nach lohnt es sich die nativen Dinge zu verwenden. So als Empfehlung ...

    Nachtrag:

    Dies sollte dann in etwa deiner Anforderung entsprechen (ungetestet):

    Add-PSSnapin Citrix*
    
    $DelProfExecutable = Join-Path -Path $PathToExe  -ChildPath DelProf2.exe
    $Servers = Get-XAServer -ZoneName "MyZone" -OnlineOnly | Select-Object -ExpandProperty ServerName | Sort-Object ServerName
    
    $UserName = Read-Host -Prompt "Please Enter the Target-Username"
    
    foreach ( $Server in $Servers ) {
    
        & $DelProfExecutable /c:$Server /id:$UserName
    
    }

    • Bearbeitet HFalkster Dienstag, 21. März 2017 06:48
    Montag, 20. März 2017 18:23
  • @Martin

    Wenn ich den Befehl ausführe bekomme ich die Meldung:

    M:\>gwmi -query "select localpath from win32_userprofile where localpath like ""%"""
    Der Befehl "gwmi" ist entweder falsch geschrieben oder
    konnte nicht gefunden werden.

    Wenn ich jedoch vorher Add-PSSnapin Citrix* lade bekomme ich ein Ergebnis:

    Add-PSSnapin Citrix* gwmi -query "select localpath from win32_userprofile where localpath like ""%""" __GENUS : 2 __CLASS : Win32_UserProfile __SUPERCLASS : __DYNASTY : __RELPATH : __PROPERTY_COUNT : 1 __DERIVATION : {} __SERVER : __NAMESPACE : __PATH : LocalPath : C:\Users\xxxxxx PSComputerName : __GENUS : 2 __CLASS : Win32_UserProfile __SUPERCLASS : __DYNASTY : __RELPATH : __PROPERTY_COUNT : 1 __DERIVATION : {} __SERVER : __NAMESPACE : __PATH : LocalPath : C:\Users\xxxxxx PSComputerName :

    usw....

    @HFalkster

    Ich dachte die Infos seinen nicht unbedingt notwendig. Kann ich aber gerne nachreichen:

    Aktuell kommt die XenApp Version 6.5 und XenDesktop 5.6 zum Einsatz.

    Was den Profil Manager angeht, bin ich mir nicht ganz sicher aber ich meine wir verwenden Microsoft Profi Manager. Das kann ich aber noch in Erfahrung bringen.


    • Bearbeitet Better_M Dienstag, 21. März 2017 07:23
    Dienstag, 21. März 2017 07:19
  • > M:\>gwmi -query "select localpath from win32_userprofile where localpath like ""%"""
    > Der Befehl "gwmi" ist entweder falsch geschrieben oder
    > konnte nicht gefunden werden.
     
    Ja, das ist ja nur ein Alias für Get-WMIObject und mußt Du in Powershell ausführen, nicht auf der Commandline...
     
    Dienstag, 21. März 2017 09:17
  • Sorry. Mein Fehler.

    Ja. Auch das funktioniert.

    Dienstag, 21. März 2017 09:57
  • > Ja. Auch das funktioniert.
     
    Dann hast Du beim ursprünglichen Kommando "irgendwas" falsch abgetippert.
     
    Dienstag, 21. März 2017 12:43
  • Also, ich habe keine Ahnung was passiert ist aber es geht. Ich habe genau die gleiche Syntax erneut kopiert und es funktioniert.

    Ich habe die beiden Zeilen untereinander gelegt und ich kann keinen Unterschied feststellen. Doch sei es drum, das wichtigste ist das es funktioniert. Danke für Eure Geduld.

    Zwischenzeitlich habe ich versucht die Variable $Computers aus einer Gruppe zu befüllen.

    [Array] $Computers = Get-ADComputer -Filter * -SearchBase "OU=XENAPP-Server-Prod, OU=RZ, DC=rlv, DC=rhld, DC=net"

    Jedoch bekomme ich diese Meldung zurück:

    WARNUNG: Der RPC-Server ist nicht verfügbar. (Ausnahme von HRESULT: 0x800706BA)
    Kann es damit zusammen hängen das dort auch XenApp Server stehen die ausgeschaltet sind?

    Dienstag, 21. März 2017 14:37
  • > [Array] $Computers = Get-ADComputer -Filter * -SearchBase "OU=XENAPP-Server-Prod, OU=RZ, DC=rlv, DC=rhld, DC=net"
     
    Was sollen die Leerzeichen da in der SearchBase?
     
    > Kann es damit zusammen hängen das dort auch XenApp Server stehen die ausgeschaltet sind?
     
    Nein, Du verbindest Dich ja net mit den Servern, sondern mit Deiner Domäne.
     
    Dienstag, 21. März 2017 16:18
  • > Kann es damit zusammen hängen das dort auch XenApp Server stehen die ausgeschaltet sind?
     
    Nein, Du verbindest Dich ja net mit den Servern, sondern mit Deiner Domäne.
     

    Vielleicht sind sie ja auch Domain Controller ;-)

    Evgenij Smirnov

    I work @ msg services ag, Berlin -> http://www.msg-services.de
    I blog (in German) @ http://it-pro-berlin.de
    my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
    Exchange User Group, Berlin -> http://exusg.de
    Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
    Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com

    Dienstag, 21. März 2017 16:53