Bagaimana cara mengekstrak daftar layanan DAN akun apa yang mereka jalankan?

13

Penekanan dari pertanyaan ini adalah pada babak kedua.

Saya tahu cara mengekstrak daftar semua layanan dan cara memfilter di negara mereka. Namun, apa yang tidak pasti saya lakukan adalah mengekstrak akun pengguna, layanan ini diatur untuk "dijalankan sebagai".

Saya tidak memiliki opsi untuk menggunakan PowerShell (sayangnya), jadi saya mencari cara CMD asli. Saya berasumsi akan ada cara untuk menggunakan perintah sc query tetapi semua daftar itu adalah:

SERVICE_NAME
TYPE
STATE
WIN32_EXIT_CODE
SERVICE_EXIT_CODE
CHECKPOINT
WAIT_HINT

FYI - OS ini adalah WIndows 2003 SP2 dan saya memerlukan informasi ini untuk semua layanan, jadi ini adalah proses yang panjang lebar jika saya harus melakukannya secara manual untuk masing-masing.

Petay87
sumber

Jawaban:

20

wmic:
Nama dan akun untuk semua layanan:
wmic service get name,startname

mulai layanan saja:
wmic service where started=true get name, startname

layanan dengan pola spesifik dalam nama:
wmic service where 'name like "%sql%"' get name, startname

diformat dengan baik sebagai tabel html (dan kemudian dibuka di browser Anda):
(wmic service where 'name like "%sql%"' get name, startname /format:htable >out.html) && out.html

Sintaks lengkap di sini: https://msdn.microsoft.com/en-us/library/aa394531%28v=vs.85%29.aspx

wmz
sumber
Apa perbedaan antara sc querydan wmic?
Pacerier
1
Perbedaan @Pacerier dalam hal apa? Mereka hanyalah alat (cmd line) yang berbeda yang memungkinkan Anda untuk menanyakan / berinteraksi dengan layanan; sc hanya untuk tujuan ini, sementara wmic lebih umum (karena memungkinkan seseorang untuk menanyakan berbagai bagian sistem). wmic juga lebih mudah digunakan untuk masalah khusus ini (hanya satu permintaan)
wmz
5

Anda dapat mencapai ini dalam dua langkah:

  1. Dapatkan daftar layanan:sc \\localhost query | findstr SERVICE_NAME
  2. Bagian Anda yang hilang: sc \\localhost qc+ SERVICE_NAME +| findstr SERVICE_START_NAME

Saya akan merekomendasikan skrip batch seperti ini:

@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

Itu memberi Anda output seperti ini: masukkan deskripsi gambar di sini

Tentu saja, Anda dapat membersihkan output tersebut atau menulis ke file CSV dengan cara apa pun yang Anda inginkan.

armani
sumber
1

CMD tidak memiliki cara asli untuk melakukannya. SC dan NET adalah aplikasi bawaan yang datang dengan Windows tetapi itu tidak berarti itu asli. Kapan saja admin dapat menghapusnya dan bahkan CMD dibiarkan dalam kegelapan.

sc sdshow adalah apa yang akan membuat Anda deskriptor keamanan, tetapi ini akan mempersulit hal-hal jika Anda tidak tahu cara membaca string SDDL.

Cara paling sederhana adalah dengan mendapatkan Sysinternals PsService.exe dari paket Tools dan menggunakannya sebagai keamanan layanan [layanan] psservice. Ini akan mencantumkan SDDL dalam format yang dapat dibaca, termasuk nama akun.

JasonXA
sumber
Apa yang Anda maksud dengan "tidak ada cara asli untuk melakukannya"? Bukan C:\Windows\System32\sc.exeuntuk semua versi windows?
Pacerier
Baca lagi. Built-in berarti tidak dapat dilepas seperti CMD. Jika admin menonaktifkan PowerShell, maka ia dapat menonaktifkan sc dan net juga. Cara paling sederhana adalah dengan menggunakan aplikasi portabel yang melakukan semuanya secara default dan tidak terikat dengan OS.
JasonXA
1

Meskipun Anda tidak dapat menggunakan PowerShell, Anda masih harus dapat menggunakan VBScript untuk menarik info dari WMI:

Berikut skrip VBS yang akan mencantumkan semua layanan dan akun yang dimulainya sebagai:

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

Simpan dan jalankan dengan cscript ScriptName.vbs.

objService.State akan memberi Anda status layanan saat ini (karena Anda menyebutkan bahwa Anda ingin memfilternya).

Info lebih lanjut tentang kelas Win32_Service .

Ƭᴇcʜιᴇ007
sumber