none
Deinstallation mehrerer Softwareprodukte auf mehreren PCs RRS feed

  • Frage

  • Hi,

    ich möchte eine bestimmte Software mit allen Unterversionen auf bestimmten PCs mit Powershell deinstallieren.

    Software = soft
    PCs = pc

    (Es soll also soft 2003, soft 2007 auf den pcs pc01, pc02 usw. deinstalliert werden)

    Zum lokalen Deinstallieren einer genau angegebenen Software funktioniert bei mir dies:
    $product=gwmi win32_product -filter "name='soft'"
    $product.uninstall()

     

    Was mir fehlt ist die richtige Syntaxt (ein match oder like sollte helfen) mit dem ich *soft* und *pc* erwische.

    Vielen Dank für Eure Hilfe!

     

    Sonntag, 4. September 2011 12:57

Antworten

  • Der genaue Filter hängt stark davon ab wie die Anwendungen wirklich heißen. Generell geht es so:

    gwmi win32_product | Where-Object {$_.Name -match "Code"} | ForEach-Object { $_.Name }
    
    # oder
    
    gwmi win32_product -Filter 'Name like "%Code%"' | ForEach-Object { $_.Name }

    Hinter ForEach-Object kommt dann anstatt $_.Name -wenn du sicher bist das der Filter keine falsch-positiven Ergebnisse erzeugt- $_.uninstall()

     

     

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Montag, 5. September 2011 16:37
    Moderator
  • >in Kombination mit Alle Computer im AD

    Dir ist klar dass das alle Server und PCs die einen AD-Account haben, betrifft?
    Das ginge dann so (mit einem Account ausführen, der lokale Adminrechte auf allen Maschinen hat):

    $ADsearcher = New-Object System.DirectoryServices.DirectorySearcher 
    $ADsearcher.SearchRoot  = New-Object System.DirectoryServices.DirectoryEntry("LDAP://dc=meinedomäne,dc=de","meinedomäne\domänenadmin","passwort")
    $ADsearcher.Filter = "(objectCategory=computer)"
    $allcomp = $ADsearcher.findall()
    
    foreach ($comp in $allcomp) {
      write-host "Verbinde zu " $comp.properties.cn
      gwmi win32_product -ComputerName $comp.properties.cn | Where-Object {$_.Name -match "soft"} | ForEach-Object { $_.name ; $_.uninstall() }
    }
    
    

    Aber:
    du solltest dieses Skript nur dann ausführen, wenn du ganz genau verstanden hast (frage bitte bei Unklarheiten) was das Skript macht! Mit den entsprechenden Berechtigungen ausgeführt, wird dieses Skript auf allen deinen Domänenrechnern jegliche Software deinstallieren, die irgendwo "soft" im Namen hat. Das heißt, z.B unter anderem sämtliche Software von Microsoft.

    Grüße, Denniver

    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".
    Montag, 5. September 2011 21:50
    Moderator
  • >Weiter unten bei dem Uninstall Befehl wird kein Benutzer angegeben - würde es funktionieren wenn ich mich dort authentifiziere?

    Probier es mal indem du am Anfang des Scripts credentials abfragst:

     

    $admin = get-credential   # auf Computern berechtigter Admin-account
    

     

    und diese dann bei gwmi benutzt:

     

    gwmi win32_product -Credential $admin -ComputerName $comp.properties.cn | Where-Object {$_.Name -match "soft"} | ForEach-Object { $_.name ; $_.uninstall() }
    

     

    Du kannst die Credentials auch fest in das Script einbauen, da es sich aber hier um ein PSCredential-Objekt handeln muss, ist das ein klein wenig aufwändiger als einfach Name/Passwort anzugeben:

     

    $secpasswd = ConvertTo-SecureString "PlainTextPassword" -AsPlainText -Force
    $mycreds = New-Object System.Management.Automation.PSCredential ("username", $secpasswd)
    

    Grüße, Denniver

     


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Mittwoch, 7. September 2011 15:04
    Moderator

Alle Antworten

  • Der genaue Filter hängt stark davon ab wie die Anwendungen wirklich heißen. Generell geht es so:

    gwmi win32_product | Where-Object {$_.Name -match "Code"} | ForEach-Object { $_.Name }
    
    # oder
    
    gwmi win32_product -Filter 'Name like "%Code%"' | ForEach-Object { $_.Name }

    Hinter ForEach-Object kommt dann anstatt $_.Name -wenn du sicher bist das der Filter keine falsch-positiven Ergebnisse erzeugt- $_.uninstall()

     

     

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Montag, 5. September 2011 16:37
    Moderator
  • Hi Denniver,

    Danke erstmal! Leider hab ich wenig Erfolg :(
    Ich habs mit der Software Irfanview testhalber versucht. Habe den Befehl mit der match Funktion gewählt:

    gwmi win32_product | Where-Object {$_.Name -match "Irfanview"} | ForEach-Object { $_.uninstall() }

    Mit meinem obigen Befehl wird die Software ohne Rückmeldung silent deinstalliert.

     

    Mir fehlt auch noch die Option für mehrere Remote PCs mittels -match "pc" + ForEach Schleife.

    Vielleicht kannst du mir nochmal unter die Arme greifen.

    Sorry meine Skriptingkenntnisse sind sehr mager.


    Danke!

     

     

    Montag, 5. September 2011 17:34
  • Also vielleicht müssen wir doch erstmal die Grundaufgabe klären.

    >Leider hab ich wenig Erfolg...
    >Mit meinem obigen Befehl wird die Software ohne Rückmeldung silent deinstalliert.

    Genau. War das nicht das was du wolltest?


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Montag, 5. September 2011 17:58
    Moderator
  • Was ich habe ist der korrekte Befehl um LOKAL eine GENAU DEFINITERE Software zu deinstallieren.

    Was ich möchte ist der korrekte Befehl um auf ALLEN REMOTE PCS, deren Computername mit pc matcht, + ALLE SOFTWAREPRODUKTE, die auf soft matchen, zu deinstallieren.

     



    • Bearbeitet mike_35 Montag, 5. September 2011 18:15
    Montag, 5. September 2011 18:13
  • >Was ich möchte ist der korrekte Befehl um auf ALLEN REMOTE PCS

    Gut. Leider existiert die Menge "ALLE REMOTE PCS" nicht. Du musst sie also selbst definieren. Sie kann basieren auf: alle Rechner im AD, alle in einer bestimmten OU, allen den eine bestimmte GPO zugewiesen ist, alle in einer Liste etc. oder jeweils eine Teilmenge einer dieser Mengen.

    >Was ich habe ist der korrekte Befehl um LOKAL eine GENAU DEFINITERE Software zu deinstallieren.

    Nein. Was du hast, ist der Befehl um lokal jede Software zu deinstallieren, die irgendwo im Namen die Buchstaben "Irfanview" oder eben "soft" hat. 

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".


    Montag, 5. September 2011 18:25
    Moderator
  • Ok, das mit dem Software Befehl ist dann wunderbar.

    Wenn möglich bitte den Befehl in Kombination mit Alle Computer im AD.

    Besten Dank!

     

    Montag, 5. September 2011 18:49
  • >in Kombination mit Alle Computer im AD

    Dir ist klar dass das alle Server und PCs die einen AD-Account haben, betrifft?
    Das ginge dann so (mit einem Account ausführen, der lokale Adminrechte auf allen Maschinen hat):

    $ADsearcher = New-Object System.DirectoryServices.DirectorySearcher 
    $ADsearcher.SearchRoot  = New-Object System.DirectoryServices.DirectoryEntry("LDAP://dc=meinedomäne,dc=de","meinedomäne\domänenadmin","passwort")
    $ADsearcher.Filter = "(objectCategory=computer)"
    $allcomp = $ADsearcher.findall()
    
    foreach ($comp in $allcomp) {
      write-host "Verbinde zu " $comp.properties.cn
      gwmi win32_product -ComputerName $comp.properties.cn | Where-Object {$_.Name -match "soft"} | ForEach-Object { $_.name ; $_.uninstall() }
    }
    
    

    Aber:
    du solltest dieses Skript nur dann ausführen, wenn du ganz genau verstanden hast (frage bitte bei Unklarheiten) was das Skript macht! Mit den entsprechenden Berechtigungen ausgeführt, wird dieses Skript auf allen deinen Domänenrechnern jegliche Software deinstallieren, die irgendwo "soft" im Namen hat. Das heißt, z.B unter anderem sämtliche Software von Microsoft.

    Grüße, Denniver

    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".
    Montag, 5. September 2011 21:50
    Moderator
  • Wenn ich das direkt am Server laufen lasse funktioniert es, Danke.

    Wenn ich allerdings mich zuerst auf den Server mittels SSH in die Powershell (ebenfalls als Domänenadmin) reinverbinde und dann die Befehle ausführe erhalte ich folgende Fehlermeldung:

    Für die $ADsearcher Zeile wird ja der Domänenadmin angegeben -> er findet auch die Computer
    Weiter unten bei dem Uninstall Befehl wird kein Benutzer angegeben - würde es funktionieren wenn ich mich dort authentifiziere?

    Ich weiß ich habe eine speziellen Anwendungsfall aber ich bin für jede Hilfe dankbar!

     

    Danke!


    • Bearbeitet mike_35 Mittwoch, 7. September 2011 13:17
    Mittwoch, 7. September 2011 13:17
  • >Weiter unten bei dem Uninstall Befehl wird kein Benutzer angegeben - würde es funktionieren wenn ich mich dort authentifiziere?

    Probier es mal indem du am Anfang des Scripts credentials abfragst:

     

    $admin = get-credential   # auf Computern berechtigter Admin-account
    

     

    und diese dann bei gwmi benutzt:

     

    gwmi win32_product -Credential $admin -ComputerName $comp.properties.cn | Where-Object {$_.Name -match "soft"} | ForEach-Object { $_.name ; $_.uninstall() }
    

     

    Du kannst die Credentials auch fest in das Script einbauen, da es sich aber hier um ein PSCredential-Objekt handeln muss, ist das ein klein wenig aufwändiger als einfach Name/Passwort anzugeben:

     

    $secpasswd = ConvertTo-SecureString "PlainTextPassword" -AsPlainText -Force
    $mycreds = New-Object System.Management.Automation.PSCredential ("username", $secpasswd)
    

    Grüße, Denniver

     


    Blog: http://bytecookie.wordpress.com

    Hilf mit und markiere hilfreiche Beiträge als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort".

    Mittwoch, 7. September 2011 15:04
    Moderator