pepper
Goto Top

Normale Domain-User sollen ein Admin-Powershell-Script ausführen

Hallo zusammen,

wir haben einen Server, auf dem eine Software läuft dessen Dienste ab und zu abschmieren.
Da ich nicht immer da bin, um den Dienst neu zu starten möchte ich jetzt gerne in Powershell ein Script schreiben, mit dem die User die Dienste neu starten können.
Die Dienste müssen allerdings als Administrator neu gestartet werden.
Wie kann ich das am Besten bewerkstelligen, dass die User die entsprechenden Dienste über ein Script neu starten können?

Viele Grüße
Christian

Content-Key: 667229

Url: https://administrator.de/contentid/667229

Ausgedruckt am: 28.03.2024 um 22:03 Uhr

Mitglied: 148121
148121 01.06.2021 aktualisiert um 11:48:48 Uhr
Goto Top
Die Dienste müssen allerdings als Administrator neu gestartet werden.
Nein, Adminrechte sind zum Starten und Stoppen nicht wirklich nötig wenn man nur Berechtigungen zum Starten/Stoppen erteilt, vergebe also stattdessen dem User granulare Berechtigungen zum Starten/Stoppen der/des entsprechenden Dienstes.
Wie das geht steht hier
Windows 2019 Server Berechtigungen für das starten und stoppen von Diensten vergeben

Gruß w.
Mitglied: DerWoWusste
DerWoWusste 01.06.2021 um 11:49:23 Uhr
Goto Top
Hi.

Wenn sich die Nutzer am Server selbst anmelden können, dann kannst Du Ihnen das Recht geben, den Dienst neu zu starten.
Das geht z.B. mit subinacl.exe, wie hier im Beispielcode für den Spoolerdienst:
subinacl.exe /service Spooler /grant=deineDom\Nutzergruppenname=TO
(TO steht hier für Start und Stop, siehe http://woshub.com/set-permissions-on-windows-service/ )

Wenn Sie sich dort nicht anmelden können, ist es aufwändiger. Um es nicht unsicher zu gestalten, würde ich es in dem Fall so machen:
1 am Server einen geplanten Task einrichten, der jede Minute in eine Freigabe schaut (welche nicht zwingend auf ihm selbst liegen muss)
2 der Nutzergruppe Schreibrechte auf die Freigabe geben
3 Im Ernstfall legt der Nutzer dort dann eine Datei Dienstname an und der geplante Task sieht diese Datei und startet genau diesen Dienst neu und löscht dann die Datei
Mitglied: em-pie
Lösung em-pie 01.06.2021 um 11:50:29 Uhr
Goto Top
Moin,

oder du etablierst einen geplanten Task auf dem Server, der halbstündlich schaut, ob der Dienst noch läuft. Wenn Nein, soll er den Dienst starten.

Setzt natürlich voraus, dass
auf dem eine Software läuft dessen Dienste ab und zu abschmieren.
bedeutet, dass Windows erkennt, dass der Dienst "verreckt" ist, z.B. dass der Dienst halt nicht mehr gestartet ist.

So prüfts du, ob ein Dienst läuft:
function FuncCheckService{
 param($ServiceName)
 $arrService = Get-Service -Name $ServiceName
 if ($arrService.Status -ne "Running"){  
 Start-Service $ServiceName
 Write-Host "Starting " $ServiceName " service"   
 " ---------------------- "   
 " Service is now started"  
 }
 if ($arrService.Status -eq "running"){   
 Write-Host "$ServiceName service is already started"  
 }
 }
Quelle: https://social.technet.microsoft.com/Forums/ie/en-US/838bda7e-726a-40c1- ...

und so, startest du einen Dienst:
Start-Service -Name "NameOfService"  
Quelle: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell. ...

Gruß
em-pie
Mitglied: Doskias
Lösung Doskias 01.06.2021 aktualisiert um 12:01:56 Uhr
Goto Top
Moin,

Ich hatte eine Zeitlang mit einer Versand-SW ein ähnliches Problem. Habe dann ein PS-Skript geschrieben, welches sekündlich den Dienst geprüft hat. Wenn er nicht lief, hab ich eine Mail bekommen und der Dienst wurde neu gestartet. Das Skript wurde über den Task-Manager gestartet. Durch Die Mails hatte ich dann sekundengenaue Informationen wann der Dienst abgestürzt ist, was die Fehlersuche in den Windows-Protokollen erleichtert hat.

Long Story short: Nach 6 Wochen ergab sich ein klares Bild. Dieses Bild habe ich dem Support mitgeteilt und wir haben ein Update bekommen. Seitdem tritt das Problem nicht wieder auf.

Nachtrag: Hier mein Skript:
$ServiceName = 'FSMS Server Service'  

while ((get-date -format HH) -lt 20)
{
$arrService = Get-Service -Name $ServiceName

    if ($arrService.Status -ne 'Running')  
    {
        Send-MailMessage -From 'Server <Server@Domain.de>' -To 'Admins<Admins@Domain.de>' -Subject 'Betreff' -Body "Mail-Text" -SmtpServer "Mailserver" -encoding ([System.Text.Encoding]::UTF8)   
        Start-Service $ServiceName
        while ($arrService.Status -ne 'Running')  
            {Start-Sleep -seconds 60
            $arrService = Get-Service -Name $ServiceName}
        Send-MailMessage -From 'Server <Server@Domain.de>' -To 'Admins<Admins@Domain.de>' -Subject 'Betreff' -Body "Mail-Text" -SmtpServer "Mailserver" -encoding ([System.Text.Encoding]::UTF8)   
    }
    Start-Sleep -Seconds 1
}