У кого-нибудь есть Powershell script для изменения учетных данных, используемых службой Windows?
Powershell script для изменения учетной записи службы
Ответ 1
Бит проще - используйте WMI.
$service = gwmi win32_service -computer [computername] -filter "name='whatever'"
$service.change($null,$null,$null,$null,$null,$null,$null,"[email protected]")
Измените имя службы соответствующим образом в фильтре; задайте имя удаленного компьютера соответствующим образом.
Ответ 2
Я написал функцию для 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()
}
Ответ 3
Я создал текстовый файл "changeserviceaccount.ps1", содержащий следующий script:
$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: свойства проекта\события сборки
Командная строка события Pre-build:
"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
Ответ 4
Ниже приведена небольшая вариация на другие скрипты. Этот параметр будет устанавливать учетные данные для любых/всех служб, работающих под указанной учетной записью. Он только попытается перезапустить службу, если она уже запущена, чтобы мы случайно не запускали службу, которая была остановлена по какой-либо причине. script должен запускаться из и приподнятой оболочки (если script начинает рассказывать вам о ReturnValue = 2
, вы, вероятно, запускаете его без повышения). Некоторые примеры использования:
-
все службы, запущенные в качестве текущего пользователя, на локальном хосте:
.\set-servicecredentials.ps1 -password [email protected]
-
все службы, запущенные как пользователь:
somedomain\someuser
на хостеsomehost.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
Ответ 5
Учитывая, что в этом классе:
$class=[WMICLASS]'\\.\root\Microsoft\SqlServer\ComputerManagement:SqlService'
существует метод с именем setserviceaccount()
, может быть script будет делать то, что вы хотите:
# 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
Ответ 6
Что я не могу найти в стеке по умолчанию PS, я нахожу его реализованным в Carbon
:
http://get-carbon.org/help/Install-Service.html
http://get-carbon.org/help/Carbon_Service.html (только для Carbon 2.0)