45

Windows サービスで使用される資格情報を変更するための Powershell スクリプトを持っている人はいますか?

4

11 に答える 11

52

少し簡単 - WMI を使用します。

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

フィルターでサービス名を適切に変更します。リモート コンピュータ名を適切に設定します。

于 2008-11-24T21:46:59.417 に答える
36

ユーザー名、パスワードを変更し、リモート コンピューターでサービスを再起動する PowerShell の関数を作成しました (ローカル サーバーを変更する場合は、localhost を使用できます)。私はこれを、何百ものサーバーでの毎月のサービス アカウント パスワードのリセットに使用してきました。

オリジナルのコピーはhttp://www.send4help.net/change-remote-windows-service-credentials-password-powershel-495にあります。

また、他の回答の1つとは異なり、サービスが完全に停止してから再開しようとするまで待機します。

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()
}
于 2010-12-06T20:59:46.677 に答える
15

次のスクリプトを含むテキスト ファイル「changeserviceaccount.ps1」を作成しました。

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

Windows サービスの開発中に、ビルド後のコマンド ラインの一部としてこれを使用しました。

Visual Studio: プロジェクト プロパティ\ビルド イベント

ビルド前のイベント コマンド ライン:

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

ビルド後のイベント コマンド ライン:

"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\installutil.exe" myservice.exe
powershell -command - < c:\psscripts\changeserviceaccount.ps1
于 2010-07-01T09:48:41.650 に答える
6

ここにある他のスクリプトのわずかなバリエーションを以下に示します。これにより、特定のログイン アカウントで実行されているすべてのサービスの資格情報が設定されます。サービスがすでに実行されている場合にのみ再起動を試みるため、何らかの理由で停止したサービスを誤って開始することはありません。スクリプトは昇格したシェルから実行する必要があります (スクリプトが について通知し始めた場合は、昇格されていない状態ReturnValue = 2で実行している可能性があります)。いくつかの使用例は次のとおりです。

  • ローカル ホストで、現在ログインしているユーザーとして実行されているすべてのサービス:

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

  • ユーザーとして実行されているすべてのサービス:somedomain\someuserホストsomehost.somedomain:

    .\set-servicecredentials.ps1 somehost.somedomain somedomain\someuser p@ssw0rd

セット 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
于 2014-09-01T11:22:39.347 に答える
3

このクラス内のことを考慮すると:

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

という名前のメソッドsetserviceaccount()があります。このスクリプトはあなたが望むことをするかもしれません:

# 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
于 2008-11-24T08:08:45.200 に答える
0

デフォルトの PS スタックで見つからないものは、次のように実装されていますCarbon

http://get-carbon.org/help/Install-Service.html

http://get-carbon.org/help/Carbon_Service.html (Carbon 2.0 のみ)

于 2015-04-20T17:50:34.470 に答える