
高い優先度で実行する必要がある 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