構文
SCコマンドの基本構文は次のようになっている。
sc [\\<サーバー名>] <コマンド> <サービス名> [<オプション>]
サーバー名はオプションであり,コマンドを適用するシステムを指定する。コマンドはSCの特定のサブコマンドである(pause,start,create,deleteなど)。サービス名はサービスの内部名であり,オプションはサブコマンドが要求する任意のオプションである。次に簡単な例を挙げる。
sc \\server1 stop lanmanserver
これを実行すると,server1サーバーに接続し,内部サービス名がlanmanserverのサーバー・サービスを停止する。ローカルのサーバー・サービスを停止する場合は,サーバー名オプションを指定しなければ良い。
サービスの内部名の取得
コマンドを利用するには,サービスの内部名を知っておく必要がある。ファイル・サーバー・サービスの表示名をServerと想定した場合,次のコマンド
sc stop server
を実行するとエラーになる。サービス名としてlanmanserverを指定した場合のみこのコマンドは正常に動作する。
この内部名はキー名とも呼ばれる。これはWindowsがこのサービスに関する情報を格納しているレジストリHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Servicesのサブキー名としてlanmanserverを使用しているためである。
よりわかりやすい表示名(ファイル・サーバー・サービスの場合はserver,DNSサーバー・サービスの場合はDNS)がわかっている場合は,getkeynameコマンドを使用すれば表示名がキー名に変換される。例えば,DNSサーバー・サービスのキー名を知るためには次のコマンドを使用できる。
sc getkeyname "dns server"
これを実行して取得されるDNSサーバー・サービスのキー名はDNSである(SCは大文字と小文字を区別しないようだ)。このコマンドは逆方向にも利用できる,つまりキー名を指定してよりわかりやすい表示名を取得することもできる。この場合はgetdisplaynameコマンドを使用する。
どのように動作するのか?
SCには先に説明したNetコマンドに対応する四つのコマンド,start,stop,pause,およびcontinueがある。例えばサーバー・サービスを一時停止するには以下を実行する。
sc pause server
SCの「stop」機能の動作は,Microsoft Management Console(MMC)ServicesスナップインまたはNet Stopコマンドとは若干異なる。ServicesスナップインおよびNet Stopはコンピュータ・ブラウザ・サービスがサーバー・サービスに依存していることを理解しているため,コンピュータ・ブラウザ・サービスも同時に停止するかどうかを尋ねてくる。
これに対してSCでは,動作中のほかのサービスが依存しているサービスにstopコントロールを送信すると,単にエラーとなる。別の言い方をすれば,SCはほかのコマンドほど賢くないということになる。
ただし,enumdependコマンドを使用すれば,指定したサービスにどのサービスが依存しているかを特定できる。
sc enumdepend lanmanserver
これを実行すると,SCは分散ファイル・システム(Distributed File System:DFS)およびブラウザ・サービスが,サーバー・サービスに依存していることを通知する。ただしSCはこの情報を,詳しい人にしかわからないような簡潔な形で返す。
例えば,queryコマンドはサービスの現在の状態の問い合わせに使用できる。
sc query lanmanserver
を実行してサーバーの状態を問い合わせると,図1に示すような形式でサービスに関する情報を表示する。
図1●クエリー・コマンドのアウトプット
SERVICE_NAME: lanmanserver TYPE : 20 WIN32_SHARE_PROCESS STATE : 4 RUNNING (STOPPABLE, PAUSABLE, ACCEPTS_SHUTDOWN) WIN32_EXIT_CODE : 0 (0x0) SERVICE_EXIT_CODE : 0 (0x0) CHECKPOINT : 0x0 WAIT_HINT : 0x0
SCは便利なツールだが,私はまだ使い始めたばかりである。次回はSCを利用するためのステップについて取り上げるので楽しみに待っていていただきたい。