Quelqu'un a-t-il un script Powershell pour modifier les informations d'identification utilisées par un service Windows?
Un peu plus facile - utilisez WMI.
$service = gwmi win32_service -computer [computername] -filter "name='whatever'"
$service.change($null,$null,$null,$null,$null,$null,$null,"P@ssw0rd")
Modifiez le nom du service de manière appropriée dans le filtre; définissez le nom de l'ordinateur distant de manière appropriée.
J'ai écrit une fonction pour PowerShell qui change le nom d'utilisateur, le mot de passe et redémarre un service sur un ordinateur distant (vous pouvez utiliser localhost si vous souhaitez changer le serveur local). Je l'ai utilisé pour les réinitialisations de mot de passe du compte de service mensuel sur des centaines de serveurs.
Vous pouvez trouver une copie de l'original à http://www.send4help.net/change-remote-windows-service-credentials-password-powershel-495
Il attend également que le service soit complètement arrêté pour essayer de le redémarrer, contrairement à l'une des autres réponses.
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()
}
J'ai créé un fichier texte "changeserviceaccount.ps1" contenant le script suivant:
$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()
Je l'ai utilisé dans le cadre de la ligne de commande post-build lors du développement d'un service Windows:
Visual Studio: Propriétés du projet\Générer des événements
Ligne de commande d'événement de pré-génération:
"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\installutil.exe" myservice.exe /u
Ligne de commande d'événement post-build:
"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\installutil.exe" myservice.exe
powershell -command - < c:\psscripts\changeserviceaccount.ps1
Une légère variation sur les autres scripts ici, est ci-dessous. Celui-ci définira les informations d'identification pour tous les services exécutés sous un compte de connexion donné. Il ne tentera de redémarrer le service que s'il était déjà en cours d'exécution, afin de ne pas démarrer accidentellement un service qui a été arrêté pour une raison. Le script doit être exécuté à partir de Shell élevé (si le script commence à vous parler de ReturnValue = 2
, vous l'exécutez probablement sans élévation). Voici quelques exemples d'utilisation:
tous les services s'exécutant en tant qu'utilisateur actuellement connecté, sur l'hôte local:
.\set-servicecredentials.ps1 -password p@ssw0rd
tous les services exécutés en tant qu'utilisateur: somedomain\someuser
sur l'hôte 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
Considérant que dans cette classe:
$class=[WMICLASS]'\\.\root\Microsoft\SqlServer\ComputerManagement:SqlService'
il y a une méthode nommée setserviceaccount()
, peut-être que script fera ce que vous voulez:
# 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
La version PowerShell 6 de Set-Service
a maintenant le -Credential
paramètre.
Voici un exemple:
$creds = Get-Credentials
Set-Service -DisplayName "Remote Registry" -Credentials $creds
À ce stade, il n'est disponible que par téléchargement via GitHub .
Prendre plaisir!
Les réponses données font le travail.
Cependant, il y a un autre détail important; afin de modifier les informations d'identification et d'exécuter le service avec succès, vous devez d'abord accorder à ce compte utilisateur les autorisations pour 'Se connecter en tant que service' .
Pour accorder ce privilège à un utilisateur, utilisez le script Powershell fourni ici en fournissant simplement le nom d'utilisateur du compte, puis exécutez les autres commandes pour mettre à jour les informations d'identification d'un service comme mentionné dans les autres réponses, c'est-à-dire ,
$svc=gwmi win32_service -filter 'Service Name'
$svc.change($null,$null,$null,$null,$null,$null,'.\username','password',$null,$null,$null)
Ce que je ne trouve pas dans la pile PS par défaut, je le trouve implémenté dans Carbon
:
http://get-carbon.org/help/Install-Service.html
http://get-carbon.org/help/Carbon_Service.html (Carbon 2.0 uniquement)