web-dev-qa-db-ja.com

サービスのリストとそれらが実行しているアカウントを抽出するにはどうすればよいですか?

この質問の重点は後半にあります。

すべてのサービスのリストを抽出する方法と、それらの状態をフィルタリングする方法を知っています。ただし、サービスが「別のユーザーとして実行」に設定されているユーザーアカウントを抽出する方法がわかりません。

(残念ながら)PowerShellを使用するオプションがないので、ネイティブCMDの方法を探しています。 sc queryコマンドを使用する方法があると思いましたが、そのリストはすべて次のとおりです。

SERVICE_NAME
TYPE
STATE
WIN32_EXIT_CODE
SERVICE_EXIT_CODE
CHECKPOINT
WAIT_HINT

参考までに-OSはWindows 2003 SP2であり、すべてのサービスでこの情報が必要なので、サービスごとに手動で実行する必要がある場合、時間のかかるプロセスになります。

13
Petay87

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

20
wmz

これは、次の2つの手順で実行できます。

  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

これにより、次のような出力が得られます。 enter image description here

もちろん、その出力をさらにクリーンアップしたり、好きな方法でCSVファイルに書き込んだりできます。

5
armani

CMDには、ネイティブな方法はありません。 SCおよびNETは、Windowsに付属している組み込みアプリケーションですが、それがネイティブであるという意味ではありません。管理者はいつでもそれらを削除でき、CMDでさえ暗いままです。

sc sdshowはセキュリティ記述子を取得するものですが、SDDL文字列の読み取り方法がわからない場合は複雑になります。

最も簡単な方法は、ツールパッケージからSysinternals PsService.exeを取得して、psservice security [サービス]として使用することです。 SDDLは、アカウント名を含む読み取り可能な形式でリストされます。

1
JasonXA

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クラス に関する詳細情報。

1