treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

※https化しました。その影響でしばらくリンク切れなどがあるかもしれませんが徐々に修正していきます。 リンク切れなどのお気づきの点がございましたらコメントなどでご指摘いただけますと助かります。

バッチファイルでサービスのスタートアップの種類を変更

前回「低スペックのWindows10PCのシャットダウンが遅い - treedown’s Report」の続き。
PC台数が多く作業を簡略化するためにバッチファイルを作ってみましたのでご報告です。

まだ、バッチファイル自体は展開していないので、どう展開しようか(そもそも展開しようか)迷い中。

調査

scコマンドで状態を調査してみることにしました。

以前使ったscコマンドのオプションqcでサービスの状態が確認できます。

「手動」に設定してある状態でコマンド実行した場合

f:id:treedown:20210824015547p:plain
--------------------------------------------------------------
>sc qc TrustedInstaller
[SC] QueryServiceConfig SUCCESS

SERVICE_NAME: TrustedInstaller
TYPE : 10 WIN32_OWN_PROCESS
START_TYPE : 3 DEMAND_START
ERROR_CONTROL : 1 NORMAL
BINARY_PATH_NAME : C:\Windows\servicing\TrustedInstaller.exe
LOAD_ORDER_GROUP : ProfSvc_Group
TAG : 0
DISPLAY_NAME : Windows Modules Installer
DEPENDENCIES :
SERVICE_START_NAME : localSystem

--------------------------------------------------------------

「自動」に設定してある状態でコマンドを実行すると、

f:id:treedown:20210824015613p:plain

--------------------------------------------------------------

>sc qc TrustedInstaller
[SC] QueryServiceConfig SUCCESS

SERVICE_NAME: TrustedInstaller
TYPE : 10 WIN32_OWN_PROCESS
START_TYPE : 2 AUTO_START
ERROR_CONTROL : 1 NORMAL
BINARY_PATH_NAME : C:\Windows\servicing\TrustedInstaller.exe
LOAD_ORDER_GROUP : ProfSvc_Group
TAG : 0
DISPLAY_NAME : Windows Modules Installer
DEPENDENCIES :
SERVICE_START_NAME : localSystem
--------------------------------------------------------------

出力から「START_TYPE」に注目。

「DEMAND_START」はスタートアップの種類が「手動」のとき、「AUTO_START」はスタートアップの種類が「自動」のとき、ちなみに、「無効」の場合には「DISABLED」になります。

これなら、findコマンドで絞り込めそうです。
※下記はコマンド実行前にservices.msc画面で条件に引っ掛かるようにスタートアップの種類は変更してコマンドを実行しています。
--------------------------------------------------------------
>sc qc TrustedInstaller | findstr "START_TYPE"
START_TYPE : 3 DEMAND_START

>sc qc TrustedInstaller | findstr "DEMAND_START"
START_TYPE : 3 DEMAND_START

>sc qc TrustedInstaller | find "AUTO_START"
START_TYPE : 2 AUTO_START
--------------------------------------------------------------
二回ほど間違ってfindstrを使ってしまいましたが、結局どちらでも同じようにgrepできることが確認できました。項目名の"START_TYPE"で絞ることもできますし、サービスの状態が手動⇒"DEMAND_START"でも、自動⇒"AUTO_START"でも現在のサービスのスタートアップの種類にある状態が一致していれば引っ掛けることが可能です。

設定を変更してみる

設定の変更をやってみることにします。
コマンドで、「sc config」を使って、スタートアップの種類を変更してみます。
まずは、コマンドオプションを確認してみます。

--------------------------------------------------------------
C:\Windows\system32>sc config /?
説明:
    レジストリおよびサービス データベースのサービス エントリを変更します。
使用法:
    sc <サーバー> config [サービス名] <オプション1> <オプション2>...

オプション:
注意: オプション名には等号が含まれています。
    等号と値の間にはスペースが必要です。
type= <own|share|interact|kernel|filesys|rec|adapt|userown|usershare>
start= <boot|system|auto|demand|disabled|delayed-auto>
error= <normal|severe|critical|ignore>
binPath= <.exe ファイルへの BinaryPathName>
group= <LoadOrderGroup>
tag= <yes|no>
depend= <依存関係 (スラッシュ (/) で区切られています)>
obj= <AccountName|ObjectName>
DisplayName= <表示名>
password= <パスワード>
--------------------------------------------------------------

scコマンドで設定変更するにはコマンドプロンプトは「管理者:」で起動する必要があります。
実際にやってみました。

--------------------------------------------------------------
C:\Windows\system32>sc config TrustedInstaller start=auto
[SC] ChangeServiceConfig SUCCESS

C:\Windows\system32>sc config TrustedInstaller start=demand
[SC] ChangeServiceConfig SUCCESS

C:\Windows\system32>
--------------------------------------------------------------

コマンド「sc config TrustedInstaller start=auto」を実行すると、スタートアップの種類が「自動」に変更され、
コマンド「sc config TrustedInstaller start=demand」を実行すると、スタートアップの種類が「手動」に変更されることが確認できました。

バッチファイル

ここまでの判定条件を二つ付けてサービスを手動に変更するバッチファイルを作ってみました。
例によって、バッチファイルの実行は"管理者として実行"をした「管理者:」付きのコマンドプロンプトでないと、設定コマンドが失敗します。

--------------------------------------------------------------

@echo off
rem スタートアップの種類を「手動」に変更するサービス名
set SERVICE=TrustedInstaller

rem サービスの状態確認:スタートアップの種類が手動かどうか
sc qc TrustedInstaller | find "DEMAND_START"
if %ERRORLEVEL% == 0 goto end
if %ERRORLEVEL% == 1 goto Nextconditions
       :Nextconditions
       rem サービスの状態確認:スタートアップの種類が自動かどうか
       sc qc TrustedInstaller | find "AUTO_START"
       if %ERRORLEVEL% == 0 goto setSvcStartup
       if %ERRORLEVEL% == 1 goto end

:setSvcStartup
rem echo サービスの設定を自動から手動に変更します。
sc config %SERVICE% start=demand

:end
rem 後処理
set SERVICE=

--------------------------------------------------------------

簡単に内容を。

最初の「set SERVICE=TrustedInstaller」行の"TrustedInstaller"の部分を別のサービス名(サービス表示名ではない)に書き換えれば、別のサービスのスタートアップを変更することもできます。

「sc qc TrustedInstaller」で判定し、スタートアップの種類が「手動」を示すDEMAND_STARTなら何もせずバッチファイルを終了。それ以外なら次の判定で「自動」を示すAUTO_STARTかどうかを判定して、条件にマッチすればサービスのスタートアップの種類を「手動」に変更するコマンドを実行して終了。

f:id:treedown:20210824020003p:plain←実行画面

あとはこれを管理者権限で自動実行できる環境でキックすれば、前回の<低スペックのWindows10PCのシャットダウンが遅い - treedown’s Report>でやったことが設定できる、という目論見です。