簡體   English   中英

用於更改服務帳戶的 Powershell 腳本

[英]Powershell script to change service account

有沒有人有一個 Powershell 腳本來更改 Windows 服務使用的憑據?

稍微簡單一點 - 使用 WMI。

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

在過濾器中適當更改服務名稱; 適當地設置遠程計算機名稱。

我為 PowerShell 編寫了一個函數,用於更改用戶名、密碼並重新啟動遠程計算機上的服務(如果要更改本地服務器,可以使用 localhost)。 我已經將它用於數百台服務器上的每月服務帳戶密碼重置。

您可以在http://www.send4help.net/change-remote-windows-service-credentials-password-powershel-495找到原始副本

與其他答案之一不同,它還會等到服務完全停止以嘗試再次啟動它。

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

我創建了一個包含以下腳本的文本文件“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

Set-Service的 PowerShell 6 版本現在具有-Credential參數。

下面是一個例子:

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

此時,它只能通過GitHub下載。

享受!

此處其他腳本的細微變化如下。 這將為在給定登錄帳戶下運行的任何/所有服務設置憑據。 如果服務已經在運行,它只會嘗試重新啟動服務,這樣我們就不會意外啟動因某種原因停止的服務。 該腳本必須從提升的 shell 運行(如果腳本開始告訴您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

考慮到這個類:

$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

給出的答案可以完成工作。

不過,還有一個重要的細節; 為了更改憑據並成功運行服務,您首先必須授予該用戶帳戶權限以“作為服務登錄”

要向用戶授予該權限,請使用此處提供的 Powershell 腳本,只需提供帳戶的用戶名,然后運行其他命令來更新其他答案中提到的服務的憑據,即,

$svc=gwmi win32_service -filter 'Service Name'

$svc.change($null,$null,$null,$null,$null,$null,'.\username','password',$null,$null,$null)
$svc = Get-WmiObject win32_service -filter "name='serviceName'"

用戶名和密碼的位置可以改變所以試試這一行找到正確的位置$svc.GetMethodParameters("change")

$svc.change($null,$null,$null,$null,$null,$null,$null,$null,$null,"admin-username","admin-password")

只是讓@alastairs 的評論更明顯:當您使用域帳戶時,第 6 個參數必須是$false而不是$null

$service = Get-WMIObject -class Win32_Service -filter 'Service Name'
$service.change($null, $null, $null, $null, $null, $false, "DOMAIN\account", "mypassword")

沒有它,它適用於我嘗試更改的 4/5 服務,但有些服務拒絕更改(錯誤 21)。

我在默認 PS 堆棧中找不到的東西,我發現它在Carbon實現:

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

http://get-carbon.org/help/Carbon_Service.html (僅限碳 2.0)

Sc 配置示例。 首先允許修改訪問某個目標文件夾,然后使用鎖定的“本地服務”帳戶。 如果我到處都有 PS 6 或更高版本,我會使用 set-service -credential。

icacls c:\users\myuser\appdata\roaming\fahclient /grant "local service:(OI)(CI)(M)"
sc config "FAHClient" obj="NT AUTHORITY\LocalService"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM