はじめまして。
VC++ラウンジへの投稿で良いのか悩みましたが、
投稿させて頂きます。
現在、タスクマネージャを制御するサービスを作成しています。
このサービスは、プロセスAが起動中の時のみタスクマネージャを
起動しない様にします。
プロセスAは、Windowsに登録されているアカウントの何れかで起動するため、
ちょっと乱暴ですが、サービスは、「HKEY_USERS」の全てのサブキー配下の以下の場所
「サブキー
\Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableTaskMgr」
を書き換えれば良いかと考え、処理としては、
「RegEnumKeyEx」で「HKEY_USERS」の全てのサブキーを取得し、
「RegSetValueEx」で書き換える様にコーディングしました。
サービスを作成する前に、その処理だけを行うアプリを作成し実行した場合は、
想定する結果を得られたのですが、サービスに組み込むと、
「HKEY_USERS」のサブキー取得時に取得する値が「HKEY_USERS」のサブキーでは、
有りませんでした。
テストアプリのユーザとサービスのユーザが違う為に起こる問題だと
考えていますが、サービスのアカウントを変えずに行う方法が無いものかと、
悩んでおります。
どなたか、お知恵をお貸し頂けないでしょうか?
宜しくお願いいたします。
【環境】
Windows Vista Business
Microsoft Visual Studio 2005(VC++)
サービスのアカウント:LocalSystem
テストアプリ :administrtor(管理者として実行を行いました。)
タスクマネージャが起動しないとユーザに
どのような利点があるのでしょうか...
タスクマネージャはかなり要のシステムサービスだから下手に加工すると
危険です。
目的は何でしょうか?タスクマネージャの動作を制限するとなると
ウイルスワクチン(ノートン、ウイルスバスタ等)位のサービスプログラムを
作らないと無理じゃないかな?
下手にレジストリーいじくるとウインドウが立ち上がらなくなる可能性があります。
仕様上の突っ込みなのですが、しかもよくありがちな。
> プロセスAが起動中の時のみタスクマネージャを起動しない様にします
タスクマネージャが起動済みだとして、その後にプロセスAが起動されたとしたら
それはサービスからタスクマネージャを殺す部分も必要になる、ということカナ。
ご連絡が遅くなり申し訳ございません。
かもねぎさん
ユーザに利点はないと思います。
ITOさん
「ウイルスワクチン(ノートン、ウイルスバスタ等)位のサービスプログラム」
と言うのが私にはちょっと想像がつきません。
すみません。スキル不足で。。
タスクマネージャの「DisableTaskMgr」以外をいじるつもりはないのですが、
それでも、ウインドウが立ち上がらなくなるものでしょうか?
玲音 (st.lain)さん
確かに、サービスからタスクマネージャを
終了する方法も考えなければならないですね。
皆様、御助言ありがとうございました。
もう少し考えてみます。
取り敢えず、クローズさせて頂きます。
要するに、プロセスAの終了を何があっても阻止したいってことですよね。
やめといたほうが無難だと思いますよ。
こんにちは。
解決としてしまったのですが、
一応やりたい処理は完成したので、
ご報告いたします。
LocalSystemで動作するサービスでは、
なぜか、レジストリの「HKEY_USERS」の
サブキーは取得できませんでした。
特権の問題かなと思いますが。。(スキル不足でよくわかりません。。)
そこで、下記の様な流れで処理を行ったところ、
一応処理がうまくいきました。
(1)「C:\Users」配下のディレクトリ名取得。
※「C:\Users」配下のディレクトリ名は、そのまま、ユーザ名になっている想定。。
(2)取得したディレクトリ名を「LookupAccountName」でSIDに変換。
この時、::GetLastErrorの値が「ERROR_NONE_MAPPED」の場合は、
取得したディレクトリ名を除外します。
(3)変換したSIDを「ConvertSidToStringSid」でテキストのSIDに変換。
(4)テキストSIDをHKEY_USERSのサブキーとして、「DisableTaskMgr」を
書込む。
目的とする処理は、できたのですが、
危険度合いも調べてみたいと思います。
また、皆様の御助言の通り危険には変わりないので、
別の方法での要件の実現も考えてみます。。
行いたいと思います。
御助言、有難う御座いました。