2008-11-24 17 views
25

Czy ktoś ma skrypt Powershell, aby zmienić poświadczenia używane przez usługę Windows?Skrypt powershell do zmiany konta usługi

+0

Czy możesz usunąć tekst z pytaniem o bonus? Zauważam, że wysłałeś to osobno. Nie mylmy ludzi, a odpowiedzi znajdują się w niewłaściwym miejscu. – halr9000

+0

[Używanie 'sc.exe'] (http://stackoverflow.com/q/308298/1394393) również jest opcją. – jpmc26

Odpowiedz

32

trochę łatwiej - używać WMI.

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

Zmień nazwę usługi odpowiednio w filtrze; odpowiednio ustaw nazwę komputera zdalnego.

+12

Tylko uwaga na temat tej odpowiedzi. Jeśli chcesz zaktualizować konto użytkownika, musisz zaktualizować wartość poprzedzającą hasło. tj. $ service.change ($ null, $ null, $ null, $ null, $ null, $ null, ". \ MyAccount", "P @ ssw0rd"). Wygląda na to, że zawsze musisz poprzedzić nazwę konta nazwą domeny lub ". \", Inaczej nie zadziała. Więcej informacji na temat innych parametrów można znaleźć tutaj: http://msdn.microsoft.com/en-us/library/windows/desktop/aa384901(v=vs.85).aspx – Rohland

+0

Zobacz także moją odpowiedź poniżej przed użyciem tego. Zmiany konta usługi wymagają zresetowania usługi i dołączenia przykładowego kodu. –

+4

Należy zauważyć, że w przypadku określania konta innego niż System lokalny zgodnie z komentarzem @ Rohland powyżej, należy również określić $ false dla parametru 6 ("DesktopInteract"). Tylko konto systemu lokalnego może uzyskać uprawnienia do interakcji z pulpitem. – alastairs

3

Biorąc pod uwagę, że w ciągu, tej klasie:

$class=[WMICLASS]'\\.\root\Microsoft\SqlServer\ComputerManagement:SqlService' 

istnieje metoda nazwie setserviceaccount(), może być to script będą robić to, co chcesz:

# Copyright Buck Woody, 2007 
# All scripts provided AS-IS. No functionality is guaranteed in any way. 
# Change Service Account name and password using PowerShell and WMI 
$class = Get-WmiObject -computername "SQLVM03-QF59YPW" -namespace 
root\Microsoft\SqlServer\ComputerManagement -class SqlService 

#This remmed out part shows the services - I'll just go after number 6 (SQL 
#Server Agent in my case): 
# foreach ($classname in $class) {write-host $classname.DisplayName} 
# $class[6].DisplayName 
stop-service -displayName $class[6].DisplayName 

# Note: I recommend you make these parameters, so that you don't store 
# passwords. At your own risk here! 
$class[6].SetServiceAccount("account", "password") 
start-service -displayName $class[6].DisplayName 
8

stworzyłem plik tekstowy „changeserviceaccount.ps1” zawierający następujący skrypt:

$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() 

użyłem to jako część linii poleceń przez post-build podczas rozwoju usługi Windows:

visual Studio: właściwości projektu \ Budowanie Imprezy

Pre-build wiersza polecenia event:

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

Post-build wiersza polecenia event:

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

napisałem funkcję PowerShell, który zmienia nazwę użytkownika, hasło i ponownie uruchamia usługę na komputerze zdalnym (można użyć localhost jeśli chcesz zmienić serwer lokalny). Używałem tego do resetowania hasła konta usługi miesięcznej na setkach serwerów.

można znaleźć kopię oryginału w http://www.send4help.net/change-remote-windows-service-credentials-password-powershel-495

czeka również aż usługa jest całkowicie zatrzymane, aby spróbować uruchomić go ponownie, w przeciwieństwie do jednego z pozostałych odpowiedzi.

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() 
} 
+1

Świetne +1. Powinieneś edytować i dołączyć linię użycia. Użycie: Set-ServiceAcctCreds -strCompName "Computer1" -strServiceName "Service" -newAcct "DOM \ ServiceUser" -newPass 'newSecureWord' – DGaleano

4

Poniżej znajduje się niewielka zmiana w innych skryptach. Ten ustawi poświadczenia dla wszystkich/wszystkich usług działających pod danym kontem logowania. Będzie próbował ponownie uruchomić usługę, jeśli już działa, abyśmy przypadkiem nie uruchomili usługi, która została zatrzymana z jakiegoś powodu. Skrypt musi zostać uruchomiony z powłoki i podniesiony (jeśli skrypt zacznie informować cię o ReturnValue = 2, prawdopodobnie uruchamiasz go jako un-podniesiony).Niektóre przykłady użycia to:

  • wszystkie usługi uruchomione jako aktualnie zalogowany użytkownik, na lokalnym komputerze:

    .\set-servicecredentials.ps1 -password [email protected]

  • wszystkie usługi uruchomione jako użytkownik: somedomain\someuser o gospodarzu somehost.somedomain:

    .\set-servicecredentials.ps1 somehost.somedomain somedomain\someuser [email protected]

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 
+1

@Kiquenet Zmodyfikowałem skrypt, aby monitować o poświadczenia dla zdalnego hosta. – grenade

Powiązane problemy