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


13

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

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

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

SERVICE_NAME
TYPE
STATE
WIN32_EXIT_CODE
SERVICE_EXIT_CODE
CHECKPOINT
WAIT_HINT

参考までに-OSは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
パセリエ2017

1
@Pacerier違いは何ですか?これらは、サービスを照会/操作するための単なる異なる(cmd行)ツールです。scはこの目的専用ですが、wmicはより一般的です(システムのさまざまな部分を照会できるため)。wmicは、この特定の問題(1つのクエリのみ)でも使いやすい
wmz

5

これは、次の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ファイルに書き込んだりできます。


1

CMDにはそれを行うネイティブの方法がありません。SCとNETはWindowsに組み込まれているアプリケーションですが、それがネイティブであるとは限りません。管理者はいつでもそれらを削除でき、CMDでさえも暗闇の中に残されます。

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

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


「それを行うネイティブな方法がない」とはどういう意味ですか?C:\Windows\System32\sc.exeWindowsのすべてのバージョンに含まれていませんか?
パセリエ2017

もう一度お読みください。組み込みとは、CMDのように取り外しできないことを意味します。管理者がPowerShellを無効にすると、scとnetも無効にできます。最も簡単な方法は、デフォルトですべてを実行し、OSに関連付けられていないポータブルアプリを使用することです。
JasonXA 2017

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.