2008-11-24 14 views
25

¿Alguien tiene un script Powershell para cambiar las credenciales utilizadas por un servicio de Windows?Script Powershell para cambiar la cuenta de servicio

+0

¿Puedes eliminar el texto de la pregunta de bonificación? Noté que publicaste eso por separado. No confundamos a las personas y las respuestas vayan al lugar equivocado. – halr9000

+0

[Usar 'sc.exe'] (http://stackoverflow.com/q/308298/1394393) también es una opción. – jpmc26

Respuesta

32

poco más fácil - el uso de WMI.

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

Cambie el nombre del servicio apropiadamente en el filtro; establezca el nombre de la computadora remota apropiadamente.

+12

Solo una nota sobre esta respuesta. Si desea actualizar la cuenta de usuario, debe actualizar el valor de la contraseña anterior. es decir $ service.change ($ null, $ null, $ null, $ null, $ null, $ null, ". \ MyAccount", "P @ ssw0rd"). Parece que siempre debe agregar un prefijo al nombre de la cuenta con el nombre de dominio o ". \", De lo contrario, no funcionará. Para obtener más información sobre los otros parámetros, consulte aquí: http://msdn.microsoft.com/en-us/library/windows/desktop/aa384901(v=vs.85).aspx – Rohland

+0

Además, eche un vistazo a mi respuesta a continuación antes de usar esto. Los cambios en la cuenta de servicio requieren un restablecimiento del servicio para que surta efecto y se incluye un código de muestra. –

+4

Tenga en cuenta que si especifica una cuenta que no sea el sistema local según el comentario anterior de @Rohland, también debe especificar $ false para el parámetro 6 ("DesktopInteract"). Solo la cuenta del sistema local puede tener permisos para interactuar con el escritorio. – alastairs

3

Teniendo en cuenta que esta clase whithin:

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

hay un método llamado setserviceaccount(), puede ser este script va a hacer lo que quiere:

# 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

he creado un archivo de texto "changeserviceaccount.ps1" que contiene la secuencia de comandos siguiente:

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

he utilizado esto como parte de por línea de comandos posterior a la generación durante el desarrollo de un servicio de Windows:

visual Studio: propiedades del proyecto \ Eventos de generación

Pre-construcción de línea de comandos del evento:

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

posterior a la generación de línea de comandos del evento:

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

escribí una función de PowerShell que cambia el nombre de usuario, contraseña y reinicia un servicio en un equipo remoto (se puede utilizar localhost si desea cambiar el servidor local) Lo he usado para restablecer la contraseña de la cuenta de servicio mensual en cientos de servidores.

se puede encontrar una copia del original en http://www.send4help.net/change-remote-windows-service-credentials-password-powershel-495

También espera hasta que el servicio se detiene por completo a tratar de empezar de nuevo, a diferencia de una de las otras respuestas.

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

Excelente +1. Debe editar e incluir la línea de uso. Uso: Set-ServiceAcctCreds -strCompName "Computer1" -strServiceName "Service" -newAcct "DOM \ ServiceUser" -newPass 'newSecureWord' – DGaleano

4

A continuación se muestra una pequeña variación de los otros scripts. Éste configurará las credenciales para cualquiera/todos los servicios que se ejecutan bajo una cuenta de inicio de sesión determinada. Solo intentará reiniciar el servicio si ya se estaba ejecutando, para que no accidentalmente iniciemos un servicio que se detuvo por algún motivo. El script debe ejecutarse desde un shell elevado (si el script comienza a informarle sobre ReturnValue = 2, probablemente lo esté ejecutando sin elevar).Algunos ejemplos de uso son:

  • todos los servicios que se ejecutan como el usuario actualmente conectado, en el host local:

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

  • todos los servicios que se ejecutan como usuario: somedomain\someuser en el host 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 He modificado la secuencia de comandos para que solicite las credenciales para el host remoto. – grenade

Cuestiones relacionadas