tipo publica privado privada perfil dominio cambiar windows powershell

privado - cambiar red publica a privada windows 10 cmd



Script Powershell para cambiar la cuenta de servicio (8)

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


Creé un archivo de texto "changeserviceaccount.ps1" que contiene el siguiente script:

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

Utilicé esto como parte de una línea de comando posterior a la creación durante el desarrollo de un servicio de Windows:

Visual Studio: propiedades del proyecto / Build Events

Línea de comando del evento preconstruido:

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

Línea de comando de evento posterior a la construcción:

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


Escribí una función para PowerShell que cambia el nombre de usuario, la contraseña y reinicia un servicio en una computadora remota (puede usar localhost si quiere cambiar el servidor local). Lo he usado para restablecer la contraseña de la cuenta de servicio mensual en cientos de servidores.

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 haya detenido por completo para tratar de iniciarlo 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() }


La versión de PowerShell 6 de Set-Service ahora tiene el parámetro -Credential .

Aquí hay un ejemplo:

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

En este punto, solo está disponible mediante descarga a través de GitHub .

¡Disfrutar!


Las respuestas dadas hacen el trabajo.

Aunque, hay otro detalle importante; para poder cambiar las credenciales y ejecutar el servicio con éxito, primero debe otorgar a esa cuenta permisos de usuario para ''Iniciar sesión como un servicio'' .

Para otorgar ese privilegio a un usuario, utilice la secuencia de comandos de Powershell proporcionada here simplemente proporcionando el nombre de usuario de la cuenta y luego ejecute los otros comandos para actualizar las credenciales de un servicio como se menciona en las otras respuestas, es decir,

$svc=gwmi win32_service -filter ''Service Name'' $svc.change($null,$null,$null,$null,$null,$null,''./username'',''password'',$null,$null,$null)



Poco más fácil: use WMI.

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

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


Teniendo en cuenta que dentro de esta clase:

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

hay un método llamado setserviceaccount() , puede ser que este script haga lo que quieras:

# 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


Una ligera variación en los otros scripts aquí, está debajo. É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 acerca de ReturnValue = 2 , probablemente lo esté ejecutando sin elevar). Algunos ejemplos de uso son:

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

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

  • todos los servicios se ejecutan como usuario: somedomain/someuser en el 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