PowerShell เปลี่ยนบัญชีเข้าสู่ระบบบริการ [3 วิธี]
คุณรู้หรือไม่ว่าบัญชีการเข้าสู่ระบบบริการคืออะไร? บริการเหล่านี้เป็นกระบวนการเบื้องหลังที่ทำงานต่อไปโดยไม่มีส่วนติดต่อผู้ใช้ในระบบปฏิบัติการ Windows บริการเหล่านี้มักได้รับการตั้งค่าให้ทำงานภายใต้บัญชีผู้ใช้เฉพาะ ซึ่งเราเรียกว่า บัญชีการเข้าสู่ระบบบริการ หรือ บัญชีบริการ บัญชีบริการนี้จะกำหนดบริบทด้านความปลอดภัยในการให้บริการ
โปรดทราบว่าการให้สิทธิ์ที่เพียงพอสามารถเปลี่ยนบริการนี้เป็นบัญชีอื่นได้ (ต้องมีอยู่ใน แผงควบคุม -> บัญชีผู้ใช้ บนเครื่องของคุณ) เราสามารถทำได้โดยใช้ GUI ของคอนโซล บริการ แต่บทช่วยสอนนี้เน้นที่วิธีการดำเนินการโดยใช้ PowerShell เรามาดำดิ่งลงถึงวิธีที่เป็นไปได้ในการทำมันกันดีกว่า
คุณต้องเรียกใช้ PowerShell ในฐานะผู้ดูแลระบบเพื่อใช้โซลูชันต่อไปนี้
การใช้ Set-Service Cmdlet [PowerShell 6.0+]
ใช้ Set-Service Cmdlet เพื่อเปลี่ยนบัญชีการเข้าสู่ระบบบริการโดยใช้ PowerShell คุณสามารถได้รับประโยชน์จาก cmdlet นี้เพื่อเปลี่ยนบัญชีบริการการเข้าสู่ระบบเท่านั้น หากคุณใช้ PowerShell เวอร์ชัน 6 หรือสูงกว่า เนื่องจากเราใช้พารามิเตอร์ -Credential ที่นำมาใช้ใน PowerShell 6.0
ใช้ Set-Service Cmdlet:
Set-Service -Name "XboxGipSvc" -Credential (Get-Credential)เอาท์พุท :
PowerShell credential request
Enter your credentials.
User: DESKTOP-THAT\Tahir
Password for user DESKTOP-THAT\Tahir: ****Set-Service cmdlet ใช้เพื่อเริ่ม หยุด และระงับบริการ และแก้ไขคุณสมบัติ พารามิเตอร์ -Name ถูกใช้เพื่อระบุชื่อบริการที่เราต้องการเปลี่ยนบัญชีการเข้าสู่ระบบบริการ ที่นี่ห้ามใช้อักขระตัวแทน แต่คุณสามารถใช้ไปป์ไลน์เพื่อส่งชื่อบริการไปที่ Set-Service cmdlet ในตัวอย่างข้างต้น "XboxGipSvc" คือชื่อบริการ อย่าลืมแทนที่ด้วยชื่อบริการของคุณ
พารามิเตอร์ -Credential ถูกใช้เพื่อระบุบัญชีที่ใช้โดยบริการเป็นบัญชีการเข้าสู่ระบบบริการ ข้อมูลรับรองบัญชีเหล่านี้ถูกดึงมาโดยใช้ Get-Credential cmdlet (อย่าลืมใส่ไว้ภายใน ()) ข้อมูลประจำตัวจะถูกเก็บไว้ในวัตถุ PSCredential และรหัสผ่านจะถูกจัดเก็บเป็น SecureString
ในโค้ดด้านบน Set-Service cmdlet ถามถึง User ซึ่งเราต้องป้อนเป็น Domain\User และ รหัสผ่าน. ที่นี่ โดเมน คือชื่อพีซีที่คุณสามารถพบได้ใน ข้อมูลจำเพาะของอุปกรณ์ ใต้ พีซีเครื่องนี้ -> คุณสมบัติ และ ผู้ใช้ คือชื่อบัญชีผู้ใช้ คุณจะเห็นสตริง * หากคุณตั้งรหัสผ่านสำหรับผู้ใช้ที่กำหนด หรือกด Enter เพื่อดำเนินการต่อ
หากคุณใช้ PowerShell เวอร์ชันต่ำกว่า 6.0 คุณสามารถใช้วิธีแก้ไขปัญหาต่อไปนี้ได้
ใช้ Get-WmiObject Cmdlet
หากต้องการเปลี่ยนบัญชีการเข้าสู่ระบบบริการโดยใช้ PowerShell:
- เก็บชื่อผู้ใช้ รหัสผ่าน (ถ้ามี) และชื่อบริการไว้ในตัวแปรแยกกัน
- ใช้ cmdlet
Get-WmiObjectเพื่อรับวัตถุ WMI สำหรับบริการที่ระบุ - ใช้วิธี
StopService()เพื่อหยุดบริการเพื่อหลีกเลี่ยงความไม่สะดวกและเก็บค่าที่ส่งคืนไว้ในตัวแปร - ใช้เงื่อนไข (คำสั่ง
if-else) กับตัวดำเนินการ-eqเพื่อตรวจสอบว่าคุณสมบัติReturnValueของตัวแปรที่สร้างในขั้นตอนก่อนหน้าเท่ากับ < รหัส>"0" หรือ"5"มิฉะนั้น ให้ย้ายไปที่บล็อกelse - ใช้
Start-Sleepcmdlet เพื่อรอ15วินาทีเพื่อให้บริการหยุดโดยสมบูรณ์ - ใช้เมธอด
Change()เพื่อเปลี่ยนบัญชีบริการการเข้าสู่ระบบและเก็บค่าที่ส่งคืนไว้ในตัวแปร - ใช้คำสั่ง
ifพร้อมด้วยตัวดำเนินการ-eqเพื่อตรวจสอบว่าคุณสมบัติReturnValueของตัวแปรที่สร้างในขั้นตอนก่อนหน้าเท่ากับ"0 ". มิฉะนั้น ให้ย้ายไปที่บล็อกelse - พิมพ์ข้อความที่กำหนดเองโดยใช้
Write-Hostcmdlet ในบล็อกif-elseทั้งหมด
ใช้ Wmi-Object Cmdlet:
$username="DESKTOP-THAT\Tahir"
$password="1234"
$serviceName="XboxGipSvc"
$serviceObj = Get-WmiObject -Class Win32_Service -Filter "name='$serviceName'"
$stopServiceStatus = $serviceObj.StopService()
if ($stopServiceStatus.ReturnValue -eq "0") {
Write-host "The '$serviceName' service Stopped." -f Green
} elseif($stopServiceStatus.ReturnValue -eq "5"){
Write-host "The '$serviceName' service is already stopped. Error code: $($stopServiceStatus.ReturnValue)" -f Yellow
}
else {
Write-host "Failed to Stop the '$serviceName' service. Error code: $($stopServiceStatus.ReturnValue)" -f Red
}
Start-Sleep -Seconds 15
$changeLogonAccountStatus = $serviceObj.Change($null,$null,$null,
$null,$null,$null,
$username,$password,$null,
$null,$null)
if ($changeLogonAccountStatus.ReturnValue -eq "0") {
Write-host "The logon account changed successfully for the '$serviceName' service." -f Green
}else {
Write-host "Failed to change the logon account for the '$serviceName' service. Error code: $($changeLogonAccountStatus.ReturnValue)" -f Red
}เอาท์พุท :
The 'XboxGipSvc' service Stopped.
The logon account changed successfully for the 'XboxGipSvc' service.ขั้นแรก เรากำหนดตัวแปร $username, $password และ $serviceName ซึ่งประกอบด้วยชื่อผู้ใช้ รหัสผ่าน (ถ้ามี มิฉะนั้นจะเป็น สตริงว่างเป็น "") และชื่อบริการ จากนั้น เราใช้ Get-WmiObject cmdlet เพื่อรับออบเจ็กต์ Windows Management Instrumentation (WMI) สำหรับบริการที่กำหนด และจัดเก็บออบเจ็กต์นี้ไว้ในตัวแปร $serviceObj
ในตัวอย่างข้างต้น วัตถุ WMI ($serviceObj) แสดงถึงบริการ Windows ที่จะมีการเปลี่ยนแปลงบัญชีการเข้าสู่ระบบ ในสคริปต์ด้านบน เราใช้พารามิเตอร์ -Class เพื่อระบุคลาส -Win32_Service
จากนั้น เราใช้วิธี StopService() ของวัตถุ $serviceObj เพื่อหยุดบริการ อย่างไรก็ตาม บล็อก if-else จะถูกดำเนินการตามค่าที่ส่งคืนของ StopService() ซึ่งเราจัดเก็บไว้ในตัวแปร $stopServiceStatus หากหยุดสำเร็จ ค่าของคุณสมบัติ ReturnValue จะเป็น "0" และบล็อก if จะถูกดำเนินการเพื่อแสดงข้อความ เป็นสีเขียว
หากบริการหยุดทำงาน ค่าของคุณสมบัติ ReturnValue จะเป็น "5" ส่งผลให้มีการดำเนินการของบล็อก elseif มิฉะนั้น บล็อก else จะถูกดำเนินการ ภายในเงื่อนไข เราใช้ Write-Host cmdlet พร้อมด้วยตัวดำเนินการรูปแบบ (-f) เพื่อพิมพ์ข้อความเป็นสีเขียว เหลือง และแดง โดยขึ้นอยู่กับว่าข้อความเหล่านั้นสำเร็จหรือไม่ คำเตือน และข้อผิดพลาด
หลังจากนั้น เราใช้ Start-Sleep cmdlet เพื่อรอ 15 วินาทีเพื่อให้บริการสิ้นสุดลงโดยสมบูรณ์ จากนั้น เราใช้เมธอด Change() ของอ็อบเจ็กต์ $serviceObj เพื่อเปลี่ยนบัญชีการเข้าสู่ระบบบริการและเก็บค่าที่ส่งคืนไว้ในตัวแปรชื่อ $changeLogonAccountStatus วิธีการ Change() ใช้อาร์กิวเมนต์ 11 อาร์กิวเมนต์ทั้งหมดเป็น $null ไม่รวมอาร์กิวเมนต์เจ็ดและแปด ซึ่งได้แก่ $username และ $password
ต่อไป เราใช้คำสั่ง if กับตัวดำเนินการ -eq เพื่อตรวจสอบว่าคุณสมบัติ ReturnValue ของ $changeLogonAccountStatus หรือไม่ เท่ากับ "0" หากเป็นเช่นนั้น เราจะใช้ Write-Host เพื่อแสดงข้อความสีเขียวระบุว่าบัญชีการเข้าสู่ระบบบริการมีการเปลี่ยนแปลง มิฉะนั้น บล็อก else จะถูกดำเนินการ โดยแสดงข้อความแสดงข้อผิดพลาดเป็นสีแดง
การใช้คำสั่ง sc.exe
ใช้คำสั่ง sc.exe เพื่อเปลี่ยนบัญชีการเข้าสู่ระบบบริการโดยใช้ PowerShell
ใช้คำสั่ง sc.exe:
$serviceName = "XboxGipSvc"
$username = "DESKTOP-THAT\Tahir"
$password = "1234"
$arguments = "config $serviceName obj= <code>"$username</code>" password= <code>"$password</code>""
Start-Process -FilePath "sc.exe" -ArgumentList $arguments -Wait -NoNewWindowเอาท์พุท :
[SC] ChangeServiceConfig SUCCESSขั้นแรก เรากำหนดตัวแปรสามตัวเพื่อเก็บชื่อผู้ใช้ รหัสผ่าน และชื่อบริการ มันเหมือนกับที่เราทำในตัวอย่างก่อนหน้านี้ จากนั้น เราเตรียมสตริงที่มีอาร์กิวเมนต์บรรทัดคำสั่งที่เราต้องการส่งไปยังเครื่องมือบรรทัดคำสั่ง sc.exe เราเก็บสตริงนี้ไว้ในตัวแปร $arguments
$arguments ถูกสร้างขึ้นโดยใช้ค่าของตัวแปร $username, $password และ $serviceName โปรดทราบว่าเราใช้เครื่องหมายย้อนกลับเพื่อเลี่ยงเครื่องหมายคำพูดคู่ก่อนและหลัง $username และ $password เพื่อส่งต่อไปยัง sc.exe เป็นค่าตัวอักษร .
จากนั้น เราใช้ Start-Process cmdlet เพื่อเริ่มกระบวนการใหม่ที่รันเครื่องมือบรรทัดคำสั่ง sc.exe โดยมี $arguments ที่กำหนดโดยใช้ พารามิเตอร์ -ArgumentList ถัดไป พารามิเตอร์ -FilePath ระบุเส้นทางไปยังไฟล์ปฏิบัติการ sc.exe ในขณะที่พารามิเตอร์ -Wait ทำให้แน่ใจว่าสคริปต์รอไฟล์ sc.exe คำสั่งให้เสร็จสิ้น (สมบูรณ์) ก่อนดำเนินการต่อ
สุดท้าย พารามิเตอร์ -NoNewWindow ตรวจสอบว่า sc.exe ทำงานในหน้าต่างคอนโซล PowerShell เดียวกัน โดยรวมแล้ว รหัสจะปรับเปลี่ยนบัญชีการเข้าสู่ระบบบริการสำหรับบริการ "XboxGipSvc" อย่าลืมเปลี่ยนชื่อบริการนี้หากคุณใช้โซลูชันนี้
นั่นคือทั้งหมดที่เกี่ยวกับบัญชีการเข้าสู่ระบบบริการการเปลี่ยนแปลง PowerShell
