Använda PowerShell för att avinstallera program

Förra året berättade jag om hur jag behövde ett skript som skulle identifiera alla versioner av ett program på en dator och avinstallera varje version en i taget. Lång historia kort, jag kunde inte hitta en, så jag slutade sätta ihop en! Sedan det ursprungliga inlägget publicerades fick jag ett antal frågor om hur man tvingar fram ett delta eller ett fullständigt SCCM -maskinvarulager efter att programmen avinstallerats. Så småningom bestämde jag mig för att uppdatera mitt ursprungliga manus och inlägget om att använda PowerShell för att avinstallera program.

Det nya skriptet innehåller en delta -inventering och det finns nu ett alternativ att tvinga fram en fullständig SCCM -maskinvaruinventering. Tidigare, om det avinstallerade programmet var en EXE -fil (och inte en MSI -fil) PowerShell skriptet skulle misslyckas eftersom den hårda koden bara skulle tillåta MSI -filer att avinstallera. Jag korrigerade detta problem, så nu är både EXE- och MSI -filer avinstallerade.

Avinstallera program - Fira

Innan jag kommer till det, men jag borde berätta för dig att min vän Jason Sandys hade redan en VBScript att göra precis vad jag letade efter förra året. Det finns ett långt inre skämt mellan oss om VBScript mot PowerShell, men jag kommer inte tröttna på det här. När jag ursprungligen letade efter manus måste det vara det PowerShell eller inget. Anledningen var då enkel. Jag behövde lära mig mer om PowerShell, så jag letade aldrig efter en VBScript och såg aldrig Jasons inlägg. Det roliga är att Jason så småningom berättade om sitt manus och visade mig en väldigt cool funktion. Du kan tvinga en maskinvarulagercykel att inträffa efteråt! Du måste kolla in Jasons manus på hans bloggsida.

Jag kan höra några av er säga, "Vilket manus är bättre?" Svaret beror enligt min mening på din förståelse av VBScript och vår PowerShell. Utanför det, välj den du gillar bäst och använd den!

Bakgrund

Jag testade produkten Övervaka informationsrapportering (MIR) som nu är en del av Enhansoft -rapportering. Denna test involverade att distribuera flera uppdateringar till mitt labbs klienter. Mitt labb är en blandning av både x86 och x64 operativsystem (OS). Efter att ha distribuerat alla dessa versioner av MIR fick jag leta efter en lösning som skulle göra det möjligt för mig att snabbt städa upp klientinstallationerna. I slutändan ville jag bara att den slutliga versionen av MIR skulle installeras på varje klient.

Avinstallera program - Test

Tyvärr fanns det inget sätt att veta vilka versioner av MIR som distribuerades till vilka testdatorer. Det fanns också möjlighet att flera testdatorer kunde ha mer än en version av MIR installerad. Jag behövde ett enkelt sätt att automatiskt upptäcka alla versioner av MIR på en dator och avinstallera var och en, en i taget, utan att behöva avinstallera det manuellt på varje dator. Sedan den här tiden kan jag med glädje säga att installationen för MIR har uppdaterats, så bara en version av den kan installeras på en dator i taget.

Tillbaka till förra årets problem. Du skulle tro att jag kunde hitta en PowerShell lösning. Har du någonsin distribuerat Adobe läsare? Då skulle du veta att det kan finnas flera olika versioner av Adobe läsare listad inom Lägg till/ta bort program (ARP) på en dator. Varför skulle det inte finnas ett enkelt sätt att ta bort de äldre versionerna?

Jag hittade mycket PowerShell skript som skulle hjälpa mig att avinstallera bara ett program i taget. Det fanns till och med några PowerShell skript där ute som skulle fråga Win32_Product och sedan avinstallera två eller flera program. Om du däremot läser Greg Ramseys blogginlägg Win32_Product Is Evil du skulle veta att det här är en dålig idé. Det ska du aldrig göra! Det är därför jag aldrig kunde använda Win32_Product i mitt skript på grund av problemen det skapar.

Använda PowerShell för att avinstallera program

På en hög nivå är detta vad jag uppdaterade PowerShell manus gör:
-Detekterar om skriptet körs i x84, x64 eller WoW32 -läge.
-Läs både x86 och x64 avinstallera registernycklar.
-Lokaliserar alla versioner av en applikation.
-Loopar igenom listan över ARP -poster och samlar in:
-MSI -namn/GUID/Avinstallera sträng.
-Detekterar om programmet är ett EXE eller MSI och avinstallerar programmet i enlighet därmed.
-Loggar varje steg till en loggfil.
-Kör en delta maskinvaruinventering eller, om flaggan är inställd, en fullständig SCCM maskinvaruinventering.

Nedan är hur det sista manuset ser ut, men du kan också ladda ner det från Enhansoft hemsida.

Avinstallera Applications - Script

Tvinga fram ett fullständigt SCCM maskinvarulager

Som standard startar en delta -maskinvaruinventeringscykel som ett av de sista stegen i skriptet. Det finns inget mer du behöver göra. Jag gillar dock att tvinga fram en fullständig inventering när jag avinstallerar program. Om du är som jag är allt du behöver göra att ändra värdet $fullinventory = $false till $true. Detta kommer att tvinga en fullständig SCCM maskinvaruinventering att inträffa.

Så här distribuerar du avinstallationsprogramskriptet med SCCM

Börja först med att redigera manuset. Ersätt programmets namn med det du vill avinstallera. I nedladdningsversionen är den för närvarande inställd på: Övervaka* Information* Rapportering* Tänk på att* är ett jokertecken som används för att söka i ARP -poster.

För det andra, bestäm om du vill tvinga fram ett fullständigt SCCM -maskinvaruinventarium, så ställ flaggan i enlighet därmed.

För det tredje, skapa ett paket och ett program för din kommandorad. Det ska se ut som följande:
powershell.exe -ExecutionPolicy bypass -fil Avinstallerav10.ps1

Fjärde, och slutligen, distribuera paketet och programmet som du skulle göra med något annat program.

Använda Uninstall Application Script

Du kan se på skärmdumpen nedan att jag hade flera kopior av MIR installerat på denna testdator förra året.

Avinstallera program - MIR -program

Jag konfigurerar mitt program för att tyst distribuera i bakgrunden. Inget att se ur slutanvändarens perspektiv!

Om du vill verifiera att PowerShell skriptet körs, titta på Aktivitetshanteraren. Du måste vara snabb! Skriptet tar bara några sekunder till några minuter att köra beroende på antalet ARP som det måste ta bort. Som en sida kan du också se att manuset kördes inom Execmgr.log på din testdator.

Avinstallera program - borttagna MIR -program

Du kan se från skärmdumpen ovan att efter några minuter allt Övervaka informationsrapportering ARP -poster togs bort.

Tänk på att maskinvaruinventeringscykeln (delta eller full) startar snart efter att alla program har avinstallerats. Det tar bara några sekunder att köra (~ 60 sekunder).

Starta om datorer

I vissa fall kanske du vill starta om datorerna efter att maskinvaruinventeringen har skickats till SCCM. I mitt fall har jag lagt till en Sova kommandot till PowerShell skript i 75 sekunder innan du startar om. Om din maskinvaruinventering tar längre tid, justera helt enkelt tiden därefter.

Här är kommandona jag använde:
Start-sömn-sekunder 75
restart -computer -force

Om du har några frågor om användning PowerShell Kontakta mig om du vill avinstallera program @GarthMJ.

Se hur Right Click Tools förändrar hur system hanteras.

Öka produktiviteten direkt med vår begränsade, kostnadsfria Community Edition.

Kom igång med Right Click Tools idag:

Dela detta:

Support

  • Detta fält används för valideringsändamål och ska lämnas oförändrat.

Kontakt

  • Detta fält används för valideringsändamål och ska lämnas oförändrat.
sv_SESwedish