web-dev-qa-db-fra.com

Script Powershell pour changer de compte de service

Quelqu'un a-t-il un script Powershell pour modifier les informations d'identification utilisées par un service Windows?

33
Jesse Weigert

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.

40
Don Jones

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()
}
34
Chris N

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
10
AndyM

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
5
grenade

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
3
VonC

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!

2
Lockszmith

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)
0
Waqas Shah

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)

0
MoonStom