Powershell // Einen Prozess auf Remotecomputern beenden

Microsoft Microsoft Powershell
Dieses Skript wurde auf eine Basis von Windows 10 Computern und Windows Server 2016 getestet.

In diesem Artikel stelle ich euch ein Skript von mir vor, mit dem ihr einen Prozess auf einem oder mehreren Remote-Computern beenden könnt.

Es gibt genau zwei Möglichkeiten Computer anzugeben in diesem Skript

  • eine .txt-Datei angeben mit einer Liste an Hostnamen
  • eine Organisationseinheit des Active Directory angeben und anhand eines Strings durchsuchen

WICHTIG:

Damit das Skript funktionieren kann, muss der Remote Computer vom ausführendem Computer aus im Netzwerk erreichbar sein und ihr braucht Admin-Rechte auf dem Remotecomputer z.B. Domain-Administrator.
Außerdem: Das Powershell-Skript kann evtl. aufgrund von ExecutionPolicys an der Ausführung gehindert werden. (Wie ihr das für Benutzer oder Computer aufhebt, gerne in einem weiteren Artikel)

Damit das Skript auch weiß welchen Dienst ihr denn beenden wollt, müsst ihr diesen ebenfalls angeben.

Das Skript zeigt euch die gefundenen Computer einmal an und fragt euch noch einmal ob ihr wirklich diesen Dienst auf diesen gefundenen Computern beenden wollt.

<#
.SYNOPSIS
    Dieses Skript beendet euch via remote-powershell Dienste
 
 
.NOTES   
    Name: PS_Remote_Dienste_beenden
    Author: Andreas Bowitz
    Version: 0.1
    LastUpdated: 2022-Dec-02
 
#>

#Prüfung ob der aktuelle Benutzer Adminrechte besitzt
Add-Type -AssemblyName System.Windows.Forms

	If (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] “Administrator”))
	{
		Write-Warning "Sie haben keine Administrator-Rechte um dieses Skript auszuführen!`nBitte starten Sie das Skript als Administrator!"
		Break
	}

$AbfrageWeg = Read-Host -Prompt "Möchten Sie eine .txt_Datei mit Computernamen angeben oder eine OU durchsuchen? Geben Sie entweder 'txt' oder 'ou' ohne ' ein."
#OU-Such Variante
	If($AbfrageWeg -eq "ou")
		{
		$Computernamen = Read-Host -Prompt "Bitte geben Sie einen String ein der in den Computernamen enthalten ist."
		$Searchbase = Read-Host -Prompt "Bitte geben Sie die Such-Basis Organisationseinheit als 'DistinguishedName' ein. Beispiel: OU=Server,DC=abow,DC=local"

		$AllComputer = Get-ADComputer -Filter "Name -like $Computernamen" -SearchBase $Searchbase | ft Name
		}
#Text-Datei Variante
	elseif ( $AbfrageWeg -eq "txt")	{
		$txt = Read-Host -Prompt "Bitte geben Sie den Pfad zur .txt-Datei an. Beispiel: C:\temp\test.txt"
		$AllComputer = [IO.File]::ReadAllText($txt)
		}
	else 
	{
		write-host 'Der Vorgang wurde angebrochen.'
		break
		PAUSE
	}

#Ausgabe der gefundenen Computer
Write-Host "Es wurden folgende Computer gefunden: " 
$AllComputer

#Angabe des Prozesses
$ProzessName = Read-Host -Prompt "Bitte geben Sie einen Prozessnamen ein. Beispiel: Microsoft.Dynamics.Nav.Client"


#Absicherungsfrage
$Abfrage = [System.Windows.Forms.MessageBox]::Show("Möchten Sie auf diesen Server wirklich den Dienst $ProzessName beenden?","Frage an den Benutzer",3,[System.Windows.Forms.MessageBoxIcon]::Question)
 
	If($Abfrage -eq "Yes")
    {
	   $cred = Get-Credential -Message "Bitte mit einem Administrator anmelden."
	   
       write-host 'Der Prozess wird jetzt beendet. '

       foreach ($Computer in $AllComputer)
            {
                   #Remote Verbindung herstellen und Prozess beenden
                   Enter-PSSession -ComputerName $Computer -credential $cred
                   write-host $Computer
								   #Animation für den User, damit er sieht das war passiert.
									for($i = 0; $i -le 100; $i++)
									{
										Write-Progress -Activity "Prozess beenden" -PercentComplete $i -Status "Fortschritt $($i)";
										Sleep -Milliseconds 10;
									}
                   invoke-command $Computer {get-process $ProzessName |stop-process -force}

                   

							#Prüfung ob der Prozess beendet ist.
							$ProzessAktiv = Get-Process $ProzessName -ComputerName $Computer -ErrorAction SilentlyContinue
							If($ProzessAktiv -eq $null){

							#Nachricht an den User das der Prozess beendet wurde.
							Write-Host “Der Prozess $ProzessName wurde auf dem Computer $Computer beendet.”
							PAUSE
                            
					Exit-PSSession
							
							else {
							Write-Host “Der Prozess konnte nicht beendet werden.”
							PAUSE
							}
											}
				}
    }
    elseif ( $Abfrage -eq "No")
    {
        write-host 'Der Vorgang wurde angebrochen.'
        break
		PAUSE
    }
    else 
    {
        write-host 'Der Vorgang wurde angebrochen.'
        break
		PAUSE
    }
	
	
	#Clear all Variables/Arrays
	$AllComputer = $null
	$ProzessName = $null
	$Abfrage = $null
	$ProzessAktiv = $null
	$i = $null
	$cred = $null
	$Computer = $null
	$txt = $null
	$AbfrageWeg = $null
	$Computernamen = $null
	$SearchBase = $null
	
	###Vorschlag: SeviceAccount anlegen und lokale Admin Rechte geben -> Fest im Skript einbauen

Hier könnt ihr das Skript herunterladen:

Wie immer berichte ich in diesem Artikel nur von meinen persönlichen Erfahrungen und Erkenntnissen/Ergebnissen.
Es handelt sich hierbei um keine offizielle Anleitung von Microsoft.
Ein nachhandeln und nutzen von Skripten geschieht auf eigene Gefahr. ;)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert