Có ai có kịch bản Powershell để thay đổi thông tin đăng nhập được sử dụng bởi dịch vụ Windows không?Kịch bản Powershell để thay đổi tài khoản dịch vụ
Trả lời
Bit dễ dàng hơn - sử dụng WMI.
$service = gwmi win32_service -computer [computername] -filter "name='whatever'"
$service.change($null,$null,$null,$null,$null,$null,$null,"[email protected]")
Thay đổi tên dịch vụ phù hợp trong bộ lọc; đặt tên máy tính từ xa một cách thích hợp.
Chỉ cần lưu ý về câu trả lời này. Nếu bạn muốn cập nhật tài khoản người dùng, bạn cần phải cập nhật giá trị trước mật khẩu. ví dụ: $ service.change ($ null, $ null, $ null, $ null, $ null, $ null, ". \ MyAccount", "P @ ssw0rd"). Có vẻ như bạn luôn cần tiền tố tên tài khoản với tên miền hoặc ". \" Nếu không nó sẽ không hoạt động. Để biết thêm thông tin về các thông số khác, vui lòng xem tại đây: http://msdn.microsoft.com/en-us/library/windows/desktop/aa384901(v=vs.85).aspx – Rohland
Ngoài ra, hãy xem câu trả lời của tôi dưới đây trước khi sử dụng. Thay đổi tài khoản dịch vụ yêu cầu đặt lại dịch vụ để có hiệu lực và mã mẫu được bao gồm. –
Lưu ý rằng nếu bạn đang chỉ định một tài khoản không phải là Hệ thống Cục bộ theo nhận xét của @ Rohland ở trên, bạn cũng phải chỉ định $ false cho tham số 6 ("DesktopInteract"). Chỉ tài khoản Hệ thống cục bộ mới có thể được cấp quyền tương tác với máy tính để bàn. – alastairs
Xét rằng whithin lớp này:
$class=[WMICLASS]'\\.\root\Microsoft\SqlServer\ComputerManagement:SqlService'
có một phương thức có tên setserviceaccount()
, có thể script này sẽ làm những gì bạn muốn:
# 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
Tôi tạo ra một tập tin văn bản "changeserviceaccount.ps1" có chứa các kịch bản sau đây:
$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()
tôi đã sử dụng điều này như một phần của bằng dòng lệnh sau xây dựng trong sự phát triển của một dịch vụ cửa sổ:
visual Studio: tính chất dự án \ build sự kiện
Pre-build dòng lệnh sự kiện:
"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\installutil.exe" myservice.exe /u
Post-build dòng lệnh sự kiện:
"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\installutil.exe" myservice.exe
powershell -command - < c:\psscripts\changeserviceaccount.ps1
Tôi đã viết một chức năng cho PowerShell rằng những thay đổi tên người dùng, mật khẩu, và khởi động lại một dịch vụ trên một máy tính từ xa (bạn có thể sử dụng localhost nếu bạn muốn thay đổi máy chủ địa phương). Tôi đã sử dụng điều này để đặt lại mật khẩu tài khoản dịch vụ hàng tháng trên hàng trăm máy chủ.
Bạn có thể tìm thấy một bản sao của bản gốc tại http://www.send4help.net/change-remote-windows-service-credentials-password-powershel-495
Nó cũng chờ đợi cho đến khi dịch vụ này được hoàn toàn dừng lại để cố gắng khởi động lại một lần nữa, không giống như một trong những câu trả lời khác.
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()
}
Tuyệt vời +1. Bạn nên chỉnh sửa và bao gồm dòng sử dụng. Cách sử dụng: Set-ServiceAcctCreds -strCompName "Computer1" -strServiceName "Dịch vụ" -newAcct "DOM \ ServiceUser" -newPass 'newSecureWord' – DGaleano
Biến thể nhỏ trên các tập lệnh khác tại đây, bên dưới. Điều này sẽ đặt thông tin đăng nhập cho bất kỳ/tất cả các dịch vụ đang chạy trong một tài khoản đăng nhập nhất định. Nó sẽ chỉ cố gắng khởi động lại dịch vụ nếu nó đã chạy, do đó chúng tôi không vô tình bắt đầu một dịch vụ đã bị dừng vì một lý do. Kịch bản phải được chạy từ và nâng vỏ (nếu kịch bản bắt đầu nói với bạn về ReturnValue = 2
, có thể bạn đang chạy nó không nâng lên).Một số ví dụ sử dụng là:
tất cả các dịch vụ đang chạy như hiện đang đăng nhập sử dụng, trên máy chủ địa phương:
.\set-servicecredentials.ps1 -password [email protected]
tất cả các dịch vụ đang chạy như người sử dụng:
somedomain\someuser
trên máy chủ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
@Kiquenet Tôi đã sửa đổi tập lệnh để bạn nhắc nhập bằng chứng xác thực cho máy chủ từ xa. – grenade
Những gì tôi không thể tìm thấy trong các mặc định PS chồng, tôi thấy nó thực hiện trong Carbon
:
http://get-carbon.org/help/Install-Service.html
http://get-carbon.org/help/Carbon_Service.html (Carbon 2,0 chỉ)
- 1. Kịch bản nâng cao Powershell
- 2. Tài khoản xác thực Windows và tài khoản dịch vụ mạng dưới dạng db_owner
- 3. Kịch bản PowerShell trong PostBuild
- 4. Tài khoản dịch vụ Google Drive - xem tệp từ tài khoản khác
- 5. Tạo tài khoản Email từ loại Dịch vụ Tài khoản hiện có
- 6. Mạo danh người dùng google với tài khoản dịch vụ
- 7. GData với Oauth bằng Tài khoản dịch vụ
- 8. Sử dụng powershell, làm thế nào để tôi cấp "Đăng nhập dưới dạng dịch vụ" cho một tài khoản?
- 9. Thêm tài khoản "Dịch vụ mạng" vào nhóm quản trị
- 10. Sử dụng Tài khoản dịch vụ, getAccessToken() trả về null
- 11. Quyền cấp phép khi xuất bản lên WMI trong tài khoản dịch vụ mạng
- 12. Sự khác biệt giữa tài khoản 'Hệ thống Cục bộ' và tài khoản 'Dịch vụ Mạng' là gì?
- 13. Gọi một kịch bản PowerShell từ Python
- 14. Kịch bản để thay đổi địa chỉ IP trên windows
- 15. Thực thi kịch bản Powershell từ Node.js
- 16. Thay đổi tên người dùng Tài khoản GitHub
- 17. Tên tài khoản nhà phát triển Apple thay đổi
- 18. Làm thế nào để có được phiên bản địa hoá của tài khoản 'Dịch vụ mạng' được tích hợp sẵn?
- 19. Xác thực cơ bản với dịch vụ WCF REST vào một tài khoản nào đó không phải là tài khoản Windows?
- 20. Kịch bản Powershell không nhận ra chức năng của tôi
- 21. Kịch bản PowerShell Để xây dựng Visual Studio Project
- 22. Sử dụng dơi để bắt đầu Powershell kịch bản
- 23. API quản trị của Google bằng Oauth2 cho Tài khoản dịch vụ (Education Edition) - Lỗi 403
- 24. Lưu trữ và truy xuất mật khẩu đúng cách cho tài khoản dịch vụ?
- 25. Thay đổi cài đặt bảo mật cấu hình DCOM bằng Powershell
- 26. Mạng xã hội (Facebook, Twitter, vv) Tích hợp tài khoản người dùng (kịch bản trùng lặp)
- 27. Julia biên dịch kịch bản mỗi lần?
- 28. Khoản trợ cấp không hợp lệ khi gọi Java Google Drive Api bằng Tài khoản dịch vụ
- 29. Làm cách nào để cấp quyền truy cập tài khoản dịch vụ Google Drive cho tài khoản Google mà không cần sử dụng các ứng dụng của Google?
- 30. Dịch vụ tài liệuDịch vụ web gốc
Bạn có thể xóa văn bản câu hỏi thưởng không? Tôi nhận thấy bạn đã đăng riêng biệt. Đừng nhầm lẫn mọi người và có câu trả lời đi sai chỗ. – halr9000
[Sử dụng 'sc.exe'] (http://stackoverflow.com/q/308298/1394393) cũng là một tùy chọn. – jpmc26