आप Windows सेवाओं को न केवल services.msc स्नैप-इन या sc.exe कमांड लाइन टूल से, बल्कि PowerShell का उपयोग करके भी प्रबंधित कर सकते हैं। इस लेख में हम PowerShell के साथ Windows सेवाओं को प्रबंधित करने के विभिन्न परिदृश्यों पर विचार करेंगे।
Windows सेवाओं को प्रबंधित करने के लिए उपयोग किए जाने वाले PowerShell Cmdlets
Windows सेवाओं की स्थिति देखने और उन्हें प्रबंधित करने के लिए आठ बुनियादी सर्विस cmdlets हैं। सर्विस प्रबंधन cmdlets की पूरी सूची प्राप्त करने के लिए, यह कमांड चलाएं:
Get-Help \*-Service

- Get-Service — स्थानीय या रिमोट कंप्यूटर पर रनिंग या स्टॉप्ड दोनों स्थितियों में सेवाओं को प्राप्त करने की अनुमति देता है;
- New-Service – एक सर्विस बनाता है। cmdlet रजिस्ट्री में और सर्विस डेटाबेस में Windows सर्विस के लिए एक नई एंट्री बनाता है;
- Restart-Service – एक सर्विस रीस्टार्ट करता है। cmdlet Windows सर्विस कंट्रोलर के माध्यम से रीस्टार्ट संदेश भेजता है;
- Resume-Service – एक सर्विस रिज्यूम करता है। cmdlet Windows सर्विस मैनेजर को रिज्यूम संदेश भेजता है;
- Set-Service — स्थानीय या रिमोट सर्विस की सेटिंग्स बदलता है, जिसमें इसकी स्थिति, विवरण, प्रदर्शित नाम या स्टार्टअप मोड शामिल है। आप इस cmdlet का उपयोग सर्विस शुरू, रोक या सस्पेंड करने के लिए भी कर सकते हैं;
- Start-Service – एक सर्विस शुरू करता है;
- Stop-Service – एक सर्विस रोकता है (cmdlet Windows सर्विस मैनेजर को रोकने का संदेश भेजता है);
- Suspend-Service – एक सर्विस सस्पेंड करता है। एक सस्पेंडेड सर्विस अभी भी चल रही है, लेकिन जब तक इसे रिज्यूम नहीं किया जाता (उदाहरण के लिए, Resume-Service cmdlet के साथ), यह कुछ नहीं करती।
आप Get-Help के साथ किसी विशेष cmdlet का विस्तृत विवरण और उपयोग के उदाहरण प्राप्त कर सकते हैं:
Get-Help Start-Service

Get-Service के साथ Windows सर्विस स्थिति कैसे जांचें?
आप Get-Service cmdlet का उपयोग करके स्थानीय या रिमोट कंप्यूटर पर सेवाओं की सूची और उनकी स्थिति (Running/Stopped) प्राप्त कर सकते हैं। -Name पैरामीटर आपको नाम से सेवाओं का चयन करने की अनुमति देता है। सर्विस नाम को वाइल्डकार्ड कैरेक्टर * का उपयोग करके निर्दिष्ट किया जा सकता है।

यदि आप सटीक सर्विस नाम नहीं जानते हैं, तो आप इसे इसके प्रदर्शित नाम का उपयोग करके -DisplayName पैरामीटर के साथ ढूंढ सकते हैं। आप मानों की सूची और वाइल्डकार्ड का उपयोग कर सकते हैं।

Get-Service cmdlet का उपयोग -ComputerName पैरामीटर के साथ रिमोट कंप्यूटर पर सर्विस स्थिति प्राप्त करने के लिए करें। आप एक साथ कई रिमोट कंप्यूटर पर सर्विस स्थिति क्वेरी कर सकते हैं उनके नाम कॉमा से अलग करके निर्दिष्ट करके। उदाहरण के लिए, नीचे दिखाया गया कमांड रिमोट कंप्यूटर ny-prnt1 और ny-prnt2 पर Spooler सर्विस स्थिति प्राप्त करता है।
Get-Service spooler –ComputerName ny-prnt1,ny-prnt2
Status Name DisplayName ------ ---- ----------- Running spooler Print Spooler Stopped spooler Print Spooler
सर्विस के सभी गुण प्रदर्शित करने के लिए, Select-Object cmdlet का उपयोग करें:
Get-Service spooler | Select-Object *

Select-Object cmdlet आपको सर्विस के विशिष्ट गुण प्राप्त करने की अनुमति देता है। उदाहरण के लिए, आप Spooler सर्विस का नाम, स्थिति और उपलब्ध विकल्प देखना चाहते हैं:
Get-Service Spooler | Select DisplayName,Status,ServiceName,Can*

Get-Service cmdlet में दो पैरामीटर हैं जो आपको सर्विस निर्भरता देखने की अनुमति देते हैं:
- -DependentServices दिए गए सर्विस पर निर्भर सेवाओं को प्रदर्शित करने की अनुमति देता है
- -RequiredServices उन सेवाओं को प्रदर्शित करता है जिन पर दी गई सर्विस निर्भर करती है
निम्न कमांड Spooler सर्विस शुरू करने के लिए आवश्यक सेवाओं को प्रदर्शित करता है:
Get-Service –Name Spooler -RequiredServices

निम्न कमांड उन सेवाओं को दिखाता है जो Spooler पर निर्भर करती हैं:
Get-Service –Name Spooler -DependentServices

यदि आप विशिष्ट स्थिति या पैरामीटर वाली सेवाओं को ढूंढना चाहते हैं, तो Where-Object cmdlet का उपयोग करें। उदाहरण के लिए, चल रही सेवाओं की सूची प्राप्त करें:
Get-Service | Where-Object {$_.status -eq 'running'}

मैन्युअल स्टार्टअप प्रकार वाली सेवाओं को प्रदर्शित करने के लिए, यह कमांड चलाएं:
Get-Service | Where-Object {$_.starttype -eq 'Manual'}

वर्तमान कंप्यूटर पर एक विशिष्ट Windows सर्विस मौजूद है या नहीं, यह जांचने के लिए निम्न PowerShell स्क्रिप्ट का उपयोग करें:
if (Get-Service "ServiceTest" -ErrorAction SilentlyContinue)
{
Write-host "ServiceTest exists"
}
PowerShell के साथ सर्विस कैसे रोकें, शुरू करें, या रीस्टार्ट करें?
आप Stop-Service cmdlet का उपयोग करके सर्विस रोक सकते हैं। Spooler रोकने के लिए, कमांड चलाएं:
Stop-Service -Name spooler
Stop-Service cmdlet निष्पादन के बाद कुछ भी प्रदर्शित नहीं करता। परिणाम देखने के लिए, -PassThru पैरामीटर का उपयोग करें।

कृपया ध्यान दें कि हर सर्विस को रोका नहीं जा सकता। यदि कोई निर्भर सर्विस हैं, तो आपको एक त्रुटि दिखाई देगी:
Cannot stop service because it has dependent services. It can only be stopped if force flag set.

सर्विस को जबरन रोकने के लिए, –Force पैरामीटर का उपयोग करें। आपको याद रखना चाहिए कि सभी निर्भर सेवाएं भी रुक जाएंगी:
Stop-Service samss –Force -Passthru
निम्न कमांड निर्दिष्ट सेवाओं (bits, spooler) को रोकेगी यदि वे "Running" स्थिति में हैं:
get-service bits,spooler | where {$_.status -eq 'running'} | stop-service –passthru

कभी-कभी सेवाएं "Stopping" स्थिति में हैंग हो जाती हैं और उन्हें जबरन किल करना पड़ता है।
Start-Service cmdlet रुकी हुई सर्विस शुरू करता है:
Start-Service -Name spooler -PassThru

यदि इसकी कोई निर्भर सर्विस रुकी हुई है तो सर्विस शुरू नहीं होगी। उन्हें ढूंढने और शुरू करने के लिए निम्न PowerShell वन-लाइनर का उपयोग करें:
get-service samss | Foreach { start-service $_.name -passthru; start-service $_.DependentServices -passthru}

Suspend-Service cmdlet सेवाओं को रोक सकता है यदि वे इस स्थिति का समर्थन करते हैं। यह जानने के लिए कि क्या सर्विस को सस्पेंड किया जा सकता है, Get-Service cmdlet का उपयोग CanPauseAndContinue गुण के साथ करें।
Get-Service samss | Format-List name, canpauseandcontinue

उन सभी सेवाओं की सूची प्रदर्शित करने के लिए जिन्हें रोका जा सकता है, यह कमांड चलाएं:
Get-Service | Where-Object {$_.canpauseandcontinue -eq "True"}

आइए SQLBrowser सर्विस को सस्पेंड करें:
Suspend-Service -Name SQLBrowser

सस्पेंडेड सर्विस को रिज्यूम करने के लिए, Resume-Service cmdlet का उपयोग करें:
Resume-Service -Name SQLBrowser

निम्न कमांड सभी सस्पेंडेड सेवाओं को रिज्यूम करेगी:
get-service | where-object {$_.Status -eq "Paused"} | resume-service
Restart-Service cmdlet एक सर्विस रीस्टार्ट करेगा:
Restart-Service -Name spooler

यह कमांड कंप्यूटर पर सभी रुकी हुई नेटवर्क सेवाओं को शुरू करती है:
get-service net* | where-object {$_.Status -eq "Stopped"} | restart-service
इन कमांड्स में -ComputerName पैरामीटर नहीं होता, लेकिन आप उन्हें Invoke-Command cmdlet या पाइप का उपयोग करके रिमोट कंप्यूटर पर चला सकते हैं।
उदाहरण के लिए, रिमोट कंप्यूटर ny-prnt1 पर प्रिंट स्पूलर रीस्टार्ट करने के लिए, कमांड चलाएं:
Get-Service Spooler -ComputerName ny-prnt1 | Start-Service
डिफ़ॉल्ट रूप से, केवल एडमिनिस्ट्रेटर Windows सेवाओं को शुरू/रोक सकते हैं, लेकिन आप गैर-एडमिन उपयोगकर्ताओं को विशिष्ट सर्विस पर शुरू/रोक/रीस्टार्ट अनुमति दे सकते हैं।
सर्विस सेटिंग्स बदलने के लिए Set-Service का उपयोग करना
Set-Service cmdlet आपको स्थानीय या रिमोट कंप्यूटर पर सर्विस के किसी भी पैरामीटर या सेटिंग को बदलने की अनुमति देता है। चूंकि सर्विस की स्थिति एक गुण है, आप इस cmdlet का उपयोग सर्विस शुरू, रोक या सस्पेंड करने के लिए कर सकते हैं। Set-Service में -StartupType पैरामीटर होता है जो सर्विस के स्टार्टअप प्रकार को बदलने की अनुमति देता है।
आइए Spooler स्टार्टअप प्रकार को ऑटोमैटिक में बदलें:
Set-Service spooler –startuptype automatic –passthru

आप मैन्युअल स्टार्टअप प्रकार सेट कर सकते हैं:
Set-Service spooler –startuptype manual –passthru

PowerShell के माध्यम से Windows सर्विस कैसे बनाएं या हटाएं?
New-Service – Windows में एक नई सर्विस बनाने के लिए एक cmdlet है। नई सर्विस के लिए नाम और निष्पादन योग्य फ़ाइल निर्दिष्ट करें (आप PowerShell स्क्रिप्ट को Windows सर्विस के रूप में भी चला सकते हैं)।
आइए TestSvc नाम से एक नई सर्विस बनाएं:
new-service -name TestSvc -binaryPathName "C:\WINDOWS\System32\svchost.exe -k netsvcs"

Get-WmiObject cmdlet का उपयोग करके सर्विस के स्टार्टअप प्रकार और विवरण के बारे में जानकारी प्राप्त करें।
get-wmiobject win32_service -filter "name='testservice'"

आप नई सर्विस की सेटिंग्स को निम्न कमांड का उपयोग करके बदल सकते हैं:
Set-Service -Name TestSvc -Description ‘My Service’ -StartupType Manual

सर्विस को हटाने के लिए, यह कमांड चलाएं:
(Get-WmiObject win32_service -Filter ″name=′TestSvc′″).delete()
Windows सर्विस चलाने वाले उपयोगकर्ता खाते को बदलें
आप PowerShell का उपयोग करके सर्विस शुरू करने के लिए उपयोग किए जाने वाले उपयोगकर्ता खाते को बदल सकते हैं। TestSvc शुरू करने के लिए उपयोग किए जाने वाले खाते का नाम प्राप्त करें:
get-wmiobject win32_service -filter "name='TestSvc'" | Select name,startname

Windows सर्विस के लिए उपयोगकर्ता नाम और पासवर्ड बदलने के लिए, निम्न कमांड चलाएं:
$svc = get-wmiobject win32_service -filter "name='TestSvc'"
$svc.GetMethodParameters("change")
Change() मेथड पैरामीटर्स की सूची प्रदर्शित होती है। गिनें कि StartName और StartPassword पैरामीटर कहां स्थित हैं: वे क्रमशः 20वें और 21वें स्थान पर हैं।

$svc | Invoke-WmiMethod -Name Change –ArgumentList @ ($null,$null,$null,$null,$null,$null,$null, $null,$null,$null,$null,$null,$null,$null,$null,$null, $null,$null,$null,"Administrator","!123Pa$$w0rd")
या आप gMSA खाते का नाम दर्ज कर सकते हैं (इस मामले में खाते का पासवर्ड निर्दिष्ट नहीं है)।
जैसा कि आप देख सकते हैं, PowerShell Windows सेवाओं को प्रबंधित करना आसान बनाता है। आप सेवाएं बना सकते हैं, रोक सकते हैं, शुरू कर सकते हैं या रिज्यूम कर सकते हैं, और उनके गुण बदल सकते हैं। अधिकांश cmdlets रिमोट कंप्यूटर पर सेवाओं को प्रबंधित करने की अनुमति देते हैं।