ฉันจะแยกรายการบริการและบัญชีใดที่พวกเขาเรียกใช้เป็นอย่างไร


13

ความสำคัญของคำถามนี้อยู่ที่ครึ่งหลัง

ฉันรู้วิธีแยกรายการบริการทั้งหมดและวิธีกรองสถานะของพวกเขา อย่างไรก็ตามสิ่งที่ฉันไม่แน่ใจว่าจะทำอย่างไรเพื่อแยกบัญชีผู้ใช้ที่ตั้งค่าบริการเป็น "ทำงานเป็น"

ฉันไม่มีตัวเลือกในการใช้ PowerShell (น่าเสียดาย) ดังนั้นฉันจึงกำลังมองหาวิธี CMD ดั้งเดิม ฉันคิดว่าจะมีวิธีใช้คำสั่ง sc query แต่รายการทั้งหมดนั้นคือ:

SERVICE_NAME
TYPE
STATE
WIN32_EXIT_CODE
SERVICE_EXIT_CODE
CHECKPOINT
WAIT_HINT

FYI - ระบบปฏิบัติการเป็น WIndows 2003 SP2 และฉันต้องการข้อมูลนี้สำหรับบริการทั้งหมดดังนั้นจึงเป็นกระบวนการที่ยืดยาวหากฉันต้องทำด้วยตนเองสำหรับแต่ละบริการ

คำตอบ:


20

wmic:
ชื่อและบัญชีสำหรับบริการทั้งหมด:
wmic service get name,startname

บริการที่เริ่มต้นเท่านั้น:
wmic service where started=true get name, startname

บริการที่มีรูปแบบเฉพาะในชื่อ:
wmic service where 'name like "%sql%"' get name, startname

จัดรูปแบบเป็นตาราง html (และเปิดในเบราว์เซอร์ของคุณ):
(wmic service where 'name like "%sql%"' get name, startname /format:htable >out.html) && out.html

ไวยากรณ์ทั้งหมดที่นี่: https://msdn.microsoft.com/en-us/library/aa394531%28v=vs.85%29.aspx


ความแตกต่างระหว่างsc queryและwmicคืออะไร
Pacerier

1
@Pierier ความแตกต่างเกี่ยวกับอะไร พวกเขาเป็นเพียงเครื่องมือที่แตกต่างกัน (บรรทัด cmd) ช่วยให้คุณสามารถสอบถาม / โต้ตอบกับบริการ sc มีไว้เพื่อจุดประสงค์นี้เท่านั้นในขณะที่ wmic นั้นกว้างกว่า (เพราะจะทำให้สามารถสืบค้นส่วนต่าง ๆ ของระบบได้) wmic นั้นยังใช้งานได้ง่ายขึ้นสำหรับปัญหานี้โดยเฉพาะ (แบบสอบถามเดียวเท่านั้น)
wmz

5

คุณสามารถทำได้ในสองขั้นตอน:

  1. รับรายการบริการ:sc \\localhost query | findstr SERVICE_NAME
  2. ชิ้นส่วนที่หายไปของคุณ: sc \\localhost qc+ SERVICE_NAME +| findstr SERVICE_START_NAME

ฉันจะแนะนำชุดสคริปต์เช่นนี้

@echo off
setlocal EnableDelayedExpansion
sc \\localhost query | findstr SERVICE_NAME > services.lst
for /f "tokens=1,2" %%A in (services.lst) do (
    echo %%B
    sc \\localhost qc %%B | findstr SERVICE_START_NAME
)
del services.lst

ที่ให้ผลลัพธ์เช่นนี้: ป้อนคำอธิบายรูปภาพที่นี่

แน่นอนคุณสามารถล้างข้อมูลออกหรือเขียนไปยังไฟล์ CSV ในลักษณะใดก็ได้ที่คุณต้องการ


1

CMD ไม่มีวิธีการดั้งเดิมที่จะทำ SC และ NET เป็นแอปพลิเคชั่นในตัวที่มาพร้อมกับ Windows แต่นั่นไม่ได้หมายความว่าเป็นของพื้นเมือง เมื่อใดก็ตามที่ผู้ดูแลระบบสามารถลบออกได้และแม้แต่ CMD ก็ยังอยู่ในที่มืด

sc sdshow คือสิ่งที่จะทำให้คุณมีตัวบอกเกี่ยวกับความปลอดภัย แต่สิ่งนี้จะทำให้สิ่งต่าง ๆ ซับซ้อนถ้าคุณไม่รู้วิธีอ่านสตริง SDDL

วิธีที่ง่ายที่สุดคือการรับ Sysinternals PsService.exe จากแพ็คเกจเครื่องมือและใช้เป็นระบบรักษาความปลอดภัย psservice [บริการ] มันจะแสดงรายการ SDDL ในรูปแบบที่อ่านได้รวมถึงชื่อบัญชี


คุณหมายถึงอะไรโดย "ไม่มีวิธีดั้งเดิมที่จะทำ" ไม่ได้อยู่ในC:\Windows\System32\sc.exewindows ทุกรุ่นใช่หรือไม่
Pacerier

อ่านอีกครั้ง. Built-in หมายถึงไม่สามารถถอดออกได้เช่น CMD หากผู้ดูแลระบบปิดการใช้งาน PowerShell เขาสามารถปิดการใช้งาน sc และ net ได้เช่นกัน วิธีที่ง่ายที่สุดคือการใช้แอพพกพาที่ทำได้โดยค่าเริ่มต้นและไม่เชื่อมโยงกับระบบปฏิบัติการ
JasonXA

1

แม้ว่าคุณจะไม่สามารถใช้ PowerShell ได้ แต่คุณควรใช้ VBScript เพื่อดึงข้อมูลจาก WMI:

นี่คือสคริปต์ VBS ที่จะแสดงรายการบริการทั้งหมดและบัญชีที่พวกเขาเริ่มเป็น:

strComputer = "."

Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colServices = objWMIService.ExecQuery ("Select * from Win32_Service")

For Each objService in colServices 
    wscript.echo objService.Name & ": " & objService.StartName
Next

cscript ScriptName.vbsบันทึกและเรียกใช้มันด้วย

objService.State จะให้สถานะปัจจุบันของบริการแก่คุณ (เนื่องจากคุณบอกว่าคุณต้องการกรองโดยบริการ)

ข้อมูลเพิ่มเติมเกี่ยวกับชั้น Win32_Service

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.