Verfügt jemand über ein Powershell-Skript zum Ändern der von einem Windows-Dienst verwendeten Anmeldeinformationen?
Antworten
Zu viele Anzeigen?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.
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()
}
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ß!
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
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 Hostsomehost.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
- See previous answers
- Weitere Antworten anzeigen