2008-11-24 35 views
25

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ụ

+0

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

+0

[Sử dụng 'sc.exe'] (http://stackoverflow.com/q/308298/1394393) cũng là một tùy chọn. – jpmc26

Trả lời

32

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.

+12

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

+0

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. –

+4

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

3

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 
8

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 
25

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

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

4

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 
+1

@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

Các vấn đề liên quan