サービスプログラムからSHGetFolderPathの使いかた 2

[戻る]
中谷 2010/11/08(月) 22:20:02
度々申し訳ありません。先日、サービスからのSHGetFolderPathの使用法で質問をさせて
もらいました。
ログインユーザの各ディレクトリの取得方法は、教えていただいたとおりで実装が出来
ましたが、作り的に少しまずいことに気づき改めて質問させていただきます。


存在するユーザ(ログアウト ユーザも含む)の各ディレクトリ名をSHGetFolderPathで
取得する方法は可能でしょうか?実際のところは自作のメソッド MySHGetFolderPath
を作成したいと思います。たとえば「User-1」「User-2」2人のユーザがいた場合、
以下のコードで
Documents and Settings\User-1\Local Settings\Temp
Documents and Settings\User-2\Local Settings\Temp
の2つのユーザパスを取得したいです。(実際はAdminなど他にも取得されそうですが)

//インターフェイス
//MySHGetFolderPath( int nFolder, CStringArray& aPath )
CStringArray aPath;
MySHGetFolderPath( CSIDL_TEMPLATES, aPath );


各ユーザのトークンを取得できれば実装できそうなのですが、
この方法わかりません。ご教授していただければ幸いです。

aetos 2010/11/09(火) 14:00:36
ログインしていないユーザーのトークンは存在しません。
LogonUser 関数でユーザーをログインさせてトークンを得ることができますが、そのた
めにはパスワードが必要です。

で、何のためにそんなことをしたいんですか?

ちなみに、CSLDI_TEMPLATES は一時ファイル置き場ではなく、エクスプローラでファイ
ルの新規作成をするときに雛形になるファイルが置いてある場所です。

中谷 2010/11/09(火) 17:58:19
返信ありがとうございます。

CSLDI_TEMPLATESは例えの話です。主のユーザデスクトップ、アプリケーションデータ配
下のパスを取得する必要があります。

サービスで動作するファイル検索のソフトを作成しています。ウィルスなど怪しいもの
を考えているわけではありません。
簡単に言うと、社内ツールで使用禁止のソフトを検索します。C:\Program Files配下
で"A"のファイルを見つけた場合、ユーザのデスクトップ(その他いろいろ)の"B(ショー
トカット、リンク)"のファイルを決め打ちで探しに行く作りです。 このときのユーザ配
下の特定ディレクトリのパスを取得したいのが今回の質問になります。

aetos 2010/11/09(火) 19:14:02
ドメイン環境ならグループポリシーで禁止した方がいいと思います。

ユーザーが Program Files 以下に自由にアプリをインストールできるということは、管
理者権限を持っているということであり、サービスを止めることも可能です。

古いスレッドには追加発言できません。