Windows サービスの優先度を変更する

Windows サービスの優先度を変更する

高い優先度で実行する必要がある Windows サービスがあります。
最終的には、このスクリプトを使用して、サービスの起動後に優先度を変更したいと思います。

Const HIGH = 256

strComputer = "."
strProcess = "BntCapi2.exe"

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colProcesses = objWMIService.ExecQuery _
    ("Select * from Win32_Process Where Name = '" & strProcess & "'")

For Each objProcess in colProcesses
    objProcess.SetPriority(HIGH)
Next

しかし、現在、タスク マネージャーを使用しても優先度を変更できません。タスク マネージャーは「アクセスが拒否されました」というエラーをスローしますが、管理者としてログオンしており、サービスのユーザー アカウントも管理者に変更しました。

優先度を変更しようとすると、依然として「アクセスが拒否されました」というメッセージが表示されます。これを行うにはどのような権限が必要かご存知ですか?

答え1

このブログでこれを行う方法を見つけました:http://akshayjain.org/blog/2008/08/hack-unable-to-change-priority-in-task-manager/

このコマンドを実行すると

ntsd -c qd taskmgr.exe

タスクマネージャはシステム権限で起動し、プロセスの優先度を変更することができます。つまり、私のwshスクリプトでもこれを行うことができます。バッチファイルを作成しました

@ECHO OFF
ntsd -c qd cscript.exe set_service_priority.vbs

そして、プロセスの優先度が希望どおりに変更されました。

当初、サービスがシステム アカウントで実行されていたため、プロセスの優先順位を変更できませんでした。奇妙なことに、サービス ユーザーadministrator(つまり私) を変更した後でも、「アクセスが拒否されました」というメッセージが表示されました。しかし、このトリックを使うと、うまく機能します。

答え2

スクリプトの先頭に次のコードを追加する必要がある場合があります。

Set objLoc = createobject("wbemscripting.swbemlocator")
objLoc.Security_.privileges.addasstring "sedebugprivilege", true 

ただし、128 を超えるものは使用したくないと思います。(256 = リアルタイム)

完全なリストはこちら:http://msdn.microsoft.com/en-us/library/aa393587.aspx

答え3

http://setiathome.berkeley.edu/forum_thread.php?id=69381

wmic プロセス where name="notepad.exe" CALL setpriority 32768

アイドル: 64 正常以下: 16384 正常: 32 正常以上: 32768 高優先度: 128 リアルタイム: 256

関連情報