¿Alguien tiene un script Powershell para cambiar las credenciales utilizadas por un servicio de Windows?Script Powershell para cambiar la cuenta de servicio
Respuesta
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.
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
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. –
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
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
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
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()
}
Excelente +1. Debe editar e incluir la línea de uso. Uso: Set-ServiceAcctCreds -strCompName "Computer1" -strServiceName "Service" -newAcct "DOM \ ServiceUser" -newPass 'newSecureWord' – DGaleano
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 hostsomehost.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
@Kiquenet He modificado la secuencia de comandos para que solicite las credenciales para el host remoto. – grenade
Lo que no puedo encontrar en la pila PS predeterminado, me parece que es implementado en Carbon
:
http://get-carbon.org/help/Install-Service.html
http://get-carbon.org/help/Carbon_Service.html (Carbon 2.0)
- 1. script de PowerShell de acceso directo para cambiar de escritorio
- 2. comando script/Powershell para restablecer un adaptador de red
- 3. Script de Powershell para eliminar archivos antiguos
- 4. Uso bate para iniciar script de PowerShell
- 5. Script de PowerShell en PostBuild
- 6. Powershell llamando al script de Powershell
- 7. Ejecutar PowerShell-Script desde la aplicación C#
- 8. Rspec debe cambiar la cuenta sin lambda
- 9. Al usar Powershell, ¿cómo concedo "Iniciar sesión como servicio" a una cuenta?
- 10. powershell: script con variables args
- 11. ¿La diferencia entre la cuenta 'Sistema local' y la cuenta 'Servicio de red'?
- 12. Run R script desde Powershell
- 13. Cómo elegir valores de cuenta y servicio para SSKeychain
- 14. ¿Script de usuario de powershell para publicar en URL?
- 15. Script de PowerShell para obtener un tamaño total de directorio
- 16. ¿Cómo proporcionar atributos de param para un script en Powershell?
- 17. API REST de llamada de PowerShell Script
- 18. Eco equivalente en PowerShell para pruebas de script
- 19. PowerShell script para crear proyecto de Visual Studio
- 20. Ruby script como servicio
- 21. variables de carga desde otro script PowerShell
- 22. GData con Oauth con la cuenta de servicio
- 23. Ejecutar un script de PowerShell desde otro
- 24. Cambiar la contraseña de root del script
- 25. ejecutando un script de Powershell desde php
- 26. ¿Cómo ejecutar un script de PowerShell?
- 27. Cómo activar la plantilla T4 del script de PowerShell
- 28. ¿Cómo hacer que Hudson CI ejecute un script de Powershell?
- 29. Utilice Regex/Powershell para cambiar el nombre de los archivos
- 30. Powershell - Crear tarea programada para ejecutar como sistema/servicio local
¿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
[Usar 'sc.exe'] (http://stackoverflow.com/q/308298/1394393) también es una opción. – jpmc26