この質問の重点は後半部分にあります。
すべてのサービスのリストを抽出し、その状態に基づいてフィルタリングする方法はわかっています。ただし、サービスが「実行」するように設定されているユーザー アカウントを抽出する方法がわかりません。
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 つの手順で実行できます。
- サービスのリストを取得します:
sc \\localhost query | findstr SERVICE_NAME
- 足りない部分:
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 クラス。