50 Stimmen

Powershell-Skript zum Ändern des Dienstkontos

Verfügt jemand über ein Powershell-Skript zum Ändern der von einem Windows-Dienst verwendeten Anmeldeinformationen?

54voto

Don Jones Punkte 9189

Etwas einfacher - verwenden Sie WMI.

$service = gwmi win32_service -computer [computername] -filter "name='whatever'"
$service.change($null,$null,$null,$null,$null,$null,$null,"P@ssw0rd")

Ändern Sie den Dienstnamen im Filter entsprechend; stellen Sie den Namen des entfernten Computers entsprechend ein.

39voto

Chris N Punkte 6809

Ich habe eine Funktion für PowerShell geschrieben, die den Benutzernamen und das Kennwort ändert und einen Dienst auf einem Remotecomputer neu startet (Sie können localhost verwenden, wenn Sie den lokalen Server ändern möchten). Ich habe diese Funktion für monatliche Kennwortrücksetzungen von Dienstkonten auf Hunderten von Servern verwendet.

Eine Kopie des Originals finden Sie unter http://www.send4help.net/change-remote-Windows-service-credentials-password-powershel-495

Im Gegensatz zu einer der anderen Antworten wird auch gewartet, bis der Dienst vollständig gestoppt ist, bevor er erneut gestartet wird.

Function Set-ServiceAcctCreds([string]$strCompName,[string]$strServiceName,[string]$newAcct,[string]$newPass){
  $filter = 'Name=' + "'" + $strServiceName + "'" + ''
  $service = Get-WMIObject -ComputerName $strCompName -namespace "root\cimv2" -class Win32_Service -Filter $filter
  $service.Change($null,$null,$null,$null,$null,$null,$newAcct,$newPass)
  $service.StopService()
  while ($service.Started){
    sleep 2
    $service = Get-WMIObject -ComputerName $strCompName -namespace "root\cimv2" -class Win32_Service -Filter $filter
  }
  $service.StartService()
}

21voto

Lockszmith Punkte 1897

Die PowerShell 6-Version von Set-Service hat jetzt die -Credential Parameter.

Hier ist ein Beispiel:

$creds = Get-Credential
Set-Service -DisplayName "Remote Registry" -Credential $creds

Zurzeit ist es nur als Download erhältlich über GitHub .

Viel Spaß!

16voto

AndyM Punkte 3454

Ich habe eine Textdatei "changeserviceaccount.ps1" erstellt, die das folgende Skript enthält:

$account="domain\user"
$password="passsword"
$service="name='servicename'"

$svc=gwmi win32_service -filter $service
$svc.StopService()
$svc.change($null,$null,$null,$null,$null,$null,$account,$password,$null,$null,$null)
$svc.StartService()

Ich habe dies als Teil einer Post-Build-Befehlszeile während der Entwicklung eines Windows-Dienstes verwendet:

Visual Studio: Projekt-Eigenschaften \Build Veranstaltungen

Befehlszeile für die Vorerstellung von Ereignissen:

"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\installutil.exe" myservice.exe /u

Befehlszeile für das Ereignis nach der Erstellung:

"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\installutil.exe" myservice.exe
powershell -command - < c:\psscripts\changeserviceaccount.ps1

6voto

grenade Punkte 30103

Eine leichte Abwandlung der anderen Skripte finden Sie weiter unten. Dieses Skript setzt die Anmeldedaten für alle Dienste, die unter einem bestimmten Anmeldekonto laufen. Es wird nur versuchen, den Dienst neu zu starten, wenn er bereits läuft, so dass wir nicht versehentlich einen Dienst starten, der aus einem bestimmten Grund gestoppt wurde. Das Skript muss von einer erhöhten Shell aus ausgeführt werden (wenn das Skript anfängt, Sie über ReturnValue = 2 Sie lassen es wahrscheinlich nicht hochgefahren laufen). Einige Anwendungsbeispiele sind:

  • alle Dienste, die unter dem aktuell angemeldeten Benutzer auf dem lokalen Host laufen:

    .\set-servicecredentials.ps1 -password p@ssw0rd

  • alle Dienste, die als Benutzer laufen: somedomain\someuser auf dem Host somehost.somedomain :

    .\set-servicecredentials.ps1 somehost.somedomain somedomain\someuser p@ssw0rd

Set-ServiceCredentials.ps1:

param (
  [alias('computer', 'c')]
  [string] $computerName = $env:COMPUTERNAME,

  [alias('username', 'u')]
  [string] $serviceUsername = "$env:USERDOMAIN\$env:USERNAME",

  [alias('password', 'p')]
  [parameter(mandatory=$true)]
  [string] $servicePassword
)
Invoke-Command -ComputerName $computerName -Script {
  param(
    [string] $computerName,
    [string] $serviceUsername,
    [string] $servicePassword
  )
  Get-WmiObject -ComputerName $computerName -Namespace root\cimv2 -Class Win32_Service | Where-Object { $_.StartName -eq $serviceUsername } | ForEach-Object {
    Write-Host ("Setting credentials for service: {0} (username: {1}), on host: {2}." -f $_.Name, $serviceUsername, $computerName)
    $change = $_.Change($null, $null, $null, $null, $null, $null, $serviceUsername, $servicePassword).ReturnValue
    if ($change -eq 0) {
      Write-Host ("Service Change() request accepted.")
      if ($_.Started) {
        $serviceName = $_.Name
        Write-Host ("Restarting service: {0}, on host: {1}, to implement credential change." -f $serviceName, $computerName)
        $stop = ($_.StopService()).ReturnValue
        if ($stop -eq 0) {
          Write-Host -NoNewline ("StopService() request accepted. Awaiting 'stopped' status.")
          while ((Get-WmiObject -ComputerName $computerName -Namespace root\cimv2 -Class Win32_Service -Filter "Name='$serviceName'").Started) {
            Start-Sleep -s 2
            Write-Host -NoNewline "."
          }
          Write-Host "."
          $start = $_.StartService().ReturnValue
          if ($start -eq 0) {
            Write-Host ("StartService() request accepted.")
          } else {
            Write-Host ("Failed to start service. ReturnValue was '{0}'. See: http://msdn.microsoft.com/en-us/library/aa393660(v=vs.85).aspx" -f $start) -ForegroundColor "red"
          }
        } else {
          Write-Host ("Failed to stop service. ReturnValue was '{0}'. See: http://msdn.microsoft.com/en-us/library/aa393673(v=vs.85).aspx" -f $stop) -ForegroundColor "red"
        }
      }
    } else {
      Write-Host ("Failed to change service credentials. ReturnValue was '{0}'. See: http://msdn.microsoft.com/en-us/library/aa384901(v=vs.85).aspx" -f $change) -ForegroundColor "red"
    }
  }
} -Credential "$env:USERDOMAIN\$env:USERNAME" -ArgumentList $computerName, $serviceUsername, $servicePassword

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X