서비스 계정을 변경하는 Powershell 스크립트
Windows 서비스에서 사용하는 자격 증명을 변경할 수 있는 Powershell 스크립트가 있습니까?
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()
}
현재 PowerShell 6 버전에는-Credential매개 변수
다음은 예입니다.
$creds = Get-Credential
Set-Service -DisplayName "Remote Registry" -Credential $creds
현재로서는 GitHub을 통한 다운로드를 통해서만 사용할 수 있습니다.
맛있게 드세요!
다음 스크립트가 포함된 "changeservice account.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
다른 스크립트에 대한 약간의 변형은 아래와 같습니다.지정된 로그인 계정으로 실행되는 모든/모든 서비스에 대한 자격 증명을 설정합니다.이미 실행 중인 경우에만 서비스를 다시 시작하려고 하므로, 이유로 중지된 서비스를 실수로 시작하지 않습니다.스크립트를 실행하고 셸을 높여야 합니다(스크립트가 다음 정보를 알려주기 시작하는 경우).ReturnValue = 2당신은 아마도 그것을 언로딩으로 실행하고 있을 것입니다.)몇 가지 사용 예는 다음과 같습니다.
로컬 호스트에서 현재 로그인한 사용자로 실행 중인 모든 서비스:
.\set-servicecredentials.ps1 -password p@ssw0rd사용자로 실행 중인 모든 서비스:
somedomain\someuser호스트로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
@alastairs의 설명을 더 잘 볼 수 있도록 하는 것: 6번째 매개 변수는 다음과 같아야 합니다.$false대신에$null도메인 계정을 사용하는 경우:
$service = Get-WMIObject -class Win32_Service -filter "name='serviceName'"
$service.change($null, $null, $null, $null, $null, $false, "DOMAIN\account", "mypassword")
그렇지 않으면 서비스의 4/5를 변경하려고 했지만 일부는 변경을 거부했습니다(오류 21).
이 클래스에 포함되는 경우:
$class=[WMICLASS]'\\.\root\Microsoft\SqlServer\ComputerManagement:SqlService'
이 스크립트가 원하는 작업을 수행할 수 있습니다.
# 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
$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")
스택에서 수 은 기본 PS 스서찾수없것는, 된것찾다니습을구현을택에 .Carbon:
http://get-carbon.org/help/Install-Service.html
http://get-carbon.org/help/Carbon_Service.html (Carbon 2.0에만 해당)
주어진 대답이 효과를 발휘합니다.
자격 증명을 변경하고 서비스를 성공적으로 실행하려면 먼저 해당 사용자 계정에 '서비스로 로그온' 권한을 부여해야 합니다.
사용자에게 해당 권한을 부여하려면 계정의 사용자 이름만 제공하여 여기에 제공된 Powershell 스크립트를 사용한 다음 다른 명령을 실행하여 다른 답변에 언급된 대로 서비스에 대한 자격 증명을 업데이트합니다.
$svc=gwmi win32_service -filter 'Service Name'
$svc.change($null,$null,$null,$null,$null,$null,'.\username','password',$null,$null,$null)
SC 구성 예제.먼저 특정 대상 폴더에 대한 수정 액세스를 허용한 다음 잠긴 "로컬 서비스" 계정을 사용합니다.모든 곳에 PS6 이상이 있다면 set-service-credential을 사용할 것입니다.
icacls c:\users\myuser\appdata\roaming\fahclient /grant "local service:(OI)(CI)(M)"
sc config "FAHClient" obj="NT AUTHORITY\LocalService"
언급URL : https://stackoverflow.com/questions/313622/powershell-script-to-change-service-account
'codememo' 카테고리의 다른 글
| PHP Ajax 업로드 진행률 표시줄 (0) | 2023.07.27 |
|---|---|
| builder @angular-devkit/build-angular:dev-server on server 명령에 대한 구현을 찾을 수 없습니다. (0) | 2023.07.27 |
| 중첩 종속성을 "yarn"으로 재정의하려면 어떻게 해야 합니까? (0) | 2023.07.27 |
| 스프링: web.xml의 네임스페이스 대 contextConfigLocation init 매개 변수 (0) | 2023.07.27 |
| Flexbox 항목을 동일한 크기로 만드는 방법 (0) | 2023.07.27 |