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

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

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

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

PowerShell を使用するオプションがないので (残念ながら)、ネイティブの CMD の方法を探しています。sc クエリ コマンドを使用する方法があると思っていましたが、リストされているのは次のものだけです。

SERVICE_NAME
TYPE
STATE
WIN32_EXIT_CODE
SERVICE_EXIT_CODE
CHECKPOINT
WAIT_HINT

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

答え1

マイク:
すべてのサービスの名前とアカウント:
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

答え2

これは次の 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

次のような出力が得られます。 ここに画像の説明を入力してください

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

答え3

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

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

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

答え4

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 クラス

関連情報