
ใน Windows มีการใช้บริการต่างๆ เพื่อเรียกใช้ไบนารีของแอปในเบื้องหลัง โดยทั่วไปแล้วไม่จำเป็นต้องมีการโต้ตอบจากผู้ใช้ บริการสามารถเริ่มต้นโดยอัตโนมัติระหว่างการบูต Windows และทำงานอย่างต่อเนื่องในพื้นหลังจนกว่าระบบจะปิดตัวลง โพสต์นี้จะอธิบายวิธีการสร้างบริการระบบใหม่จากไฟล์ไบนารีที่ปฏิบัติการได้
มีเครื่องมือ Windows ในตัวหลายอย่างที่ช่วยให้ผู้ดูแลระบบสามารถสร้างบริการใหม่ผ่านทางพรอมต์คำสั่งได้ ซึ่งรวมถึงคำสั่งคอนโซล sc.exe และ PowerShell cmdlet บริการใหม่
คำสั่งต่อไปนี้จะสร้างบริการใหม่จากไฟล์ปฏิบัติการที่ระบุพร้อมอาร์กิวเมนต์เพิ่มเติม:
sc สร้าง CorpCollectorService binPath = "C:\Program Files (x86)\CORP\collector.exe-i C:\tools\config.xml"start=auto DisplayName =บริการตัวรวบรวมบันทึก CORP"

หากดำเนินการคำสั่งสำเร็จ ข้อความจะปรากฏขึ้น:
SC CreateService SUCCESS
มีการใช้อาร์กิวเมนต์ต่อไปนี้:
-
CorpCollectorService– ชื่อบริการใหม่ -
binPath– มีพาธแบบเต็มไปยังไฟล์ปฏิบัติการ พร้อมด้วยอาร์กิวเมนต์การเรียกทำงานที่จำเป็น (ในเครื่องหมายคำพูดหากมีช่องว่าง) -
start=auto– เริ่มบริการโดยอัตโนมัติเมื่อบูต Windows (boot|system|auto|demand|disabled) -
DisplayName— ชื่อที่แสดงบริการ
สามารถใช้พารามิเตอร์เพิ่มเติมได้:
ประเภท— ประเภทของบริการ โดยค่าเริ่มต้น
เป็นเจ้าของ
ถูกใช้ หมายความว่าบริการทำงานตามกระบวนการของตัวเอง คุณยังสามารถระบุได้ที่นี่: own|share|kernel|filesys|adapt|rec|interact
- โดยค่าเริ่มต้น บริการจะทำงานในนามของ
ระบบท้องถิ่น หากคุณต้องการใช้บริการในนามของบัญชีผู้ใช้เฉพาะ ให้ระบุชื่อผู้ใช้และรหัสผ่านโดยใช้ตัวเลือก: obj="woshub\user1"password="myUserPassw0r1"
ตอนนี้ เปิดสแนปอินการจัดการบริการกราฟิกของบริการ ( services.msc ) บริการใหม่จะปรากฏในรายการบริการ (กด F5 เพื่อรีเฟรชฐานข้อมูลตัวจัดการบริการ) ที่นี่คุณสามารถเริ่มหรือหยุดบริการหรือเปลี่ยนประเภทการเริ่มต้นได้ 
การตั้งค่าบริการทั้งหมดจะถูกเก็บไว้ภายใต้คีย์รีจิสทรี HKEY\_LOCAL\_MACHINE\SYSTEM\CurrentControlSet\Services\ คีย์ย่อย CorpCollectorService ถูกสร้างขึ้นโดยอัตโนมัติสำหรับบริการใหม่

นี่คือคำสั่ง PowerShell ที่คล้ายกันสำหรับการสร้างบริการใหม่:
ชื่อบริการใหม่ CorpCollectorService-BinaryPathName "C:\Program Files (x86)\CORP\collector.exe-i C:\tools\config.xml"-DisplayName "บริการทดสอบของฉัน"-คำอธิบาย "CORP Log Collector Service"-StartupType "อัตโนมัติ"

หากคุณต้องการกำหนดค่าชื่อผู้ใช้และรหัสผ่านเพื่อเริ่มบริการ ให้ใช้ไวยากรณ์ต่อไปนี้:
` $username=“user123”$password=“PaSSw0rd1”$securepassword=ConvertTo-SecureString $password-AsPlainText-บังคับ
$cred=New-Object System.Management.Automation.PSCredential ($ชื่อผู้ใช้, $securepassword)
บริการใหม่ …-ข้อมูลรับรอง $cred `
โปรดทราบว่าไบนารีที่ปฏิบัติการได้บางตัวอาจไม่สามารถทำงานได้สำเร็จในฐานะบริการของ Windows แอปพลิเคชันต้องได้รับการออกแบบมาโดยเฉพาะเพื่อทำงานเป็นบริการที่ตอบสนองต่อคำสั่งจาก Service Control Manager (SCM) ข้อผิดพลาด 1,053 จะปรากฏขึ้นเมื่อพยายามเริ่มบริการที่ไม่สามารถจัดการสัญญาณควบคุม SCM:
Windows could not start the MyService1 service on Local Computer.Error 1053: The service did not respond to the start or control request in a timely fashion.

สามารถใช้เครื่องมือของบริษัทอื่นหลายอย่างเพื่อสร้างบริการจากโปรแกรมที่ไม่ได้รับการออกแบบมาให้ทำงานในโหมดบริการ Windows (รวมถึงโปรแกรมที่มีอินเทอร์เฟซแบบกราฟิก) Windows Server Resource Kit 2003 มีคำสั่ง srvany.exe และ instsrv.exe ซึ่งสามารถนำไปใช้สร้างบริการจากไบนารีใดก็ได้ อย่างไรก็ตาม ตอนนี้ควรใช้เครื่องมือ NSSM ( Non-Sucking Service Manager) ที่ทันสมัยกว่า ต่างจากเครื่องมือ Microsoft รุ่นเก่าตรงที่จะตรวจสอบกระบวนการแอปที่ทำงานอยู่และมีความสามารถในการจัดการกระบวนการขั้นสูง NSSM สามารถเรียกใช้แอป สคริปต์ หรือปฏิบัติการใดๆ ก็ได้เป็นบริการ Windows พื้นหลังที่เชื่อถือได้ และรีสตาร์ทโดยอัตโนมัติหากเกิดปัญหา
NSSM สามารถติดตั้งได้โดยใช้ตัวจัดการแพ็คเกจ WinGet:
ติดตั้ง winget--id NSSM.NSSM-e
ตอนนี้ หากต้องการสร้างบริการจากไฟล์ปฏิบัติการใด ๆ ให้รัน:
nssm ติดตั้ง testservice "C:\Tools\collector.exe"
โปรดทราบว่าในคุณสมบัติของบริการใหม่ nssm.exe ทำหน้าที่เป็นตัวเรียกใช้งานสำหรับไบนารีของแอปพลิเคชันของคุณ

NSSM จัดเตรียม GUI แบบธรรมดาที่ช่วยให้สามารถกำหนดค่าพารามิเตอร์บริการได้อย่างสะดวก
ตัวอย่างเช่น หากต้องการแก้ไขบริการที่สร้างไว้ก่อนหน้านี้ ให้รัน:
บริการทดสอบการแก้ไข nssm

ก่อนหน้านี้เราได้สาธิตวิธีการใช้ NSSM เพื่อเรียกใช้สคริปต์ PowerShell เป็นบริการของระบบ
*️⃣ ลิงค์ที่มา:
ตัวจัดการแพ็คเกจ WinGet เรียกใช้สคริปต์ PowerShell เป็นบริการระบบ