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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 667229
Url: https://administrator.de/contentid/667229
Ausgedruckt am: 25.11.2024 um 17:11 Uhr
4 Kommentare
Neuester Kommentar
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.
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:
(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
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
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
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
So prüfts du, ob ein Dienst läuft:
Quelle: https://social.technet.microsoft.com/Forums/ie/en-US/838bda7e-726a-40c1- ...
und so, startest du einen Dienst:
Quelle: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell. ...
Gruß
em-pie
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"
}
}
und so, startest du einen Dienst:
Start-Service -Name "NameOfService"
Gruß
em-pie
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:
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
}