|
分類:[C/C++]
自プロセスが Administrators グループに属するアカウントから起動されたかどうかを調べるには、どうすればいいですか?
Visual C++ 7.1 UnManaged (MFC/ATL) です。 Program Files 以下にあるファイル(具体的には InstallShield のインストール ログ ファイル)を削除しようとしています。しかし、Program Files 以下にあるため、Users グループのアカウントではアクセス違反が発生します。 ファイル削除を試みれば失敗するのでわかるのですが、アプリケーション起動時に「権限持ってないよ」と通知できれば、その方が親切かと思い、プロセスがどのアカウントから起動されているか調べたいと思います。
ざっと MSDN を見ると、PrivilegeCheck 関数が該当するように思ったのですが、RequiredPrivileges で詰まりました。PRIVILEGE_SET 構造体ですが、このメンバである Control が何を意味するのかわかりません。「Specifies a control flag related to the privileges.」と書かれていますが、どんな値(フラグ)が指定できるのか、わかりません。例として出ている「PRIVILEGE_SET_ALL_NECESSARY」を、Platform SDK で検索すると、WinNT.h に定義が見つかりましたが、コレが 1 と定義されているだけで、他に類似のものが見つかりません。 また、Privileges メンバに指定するものも不明です。LUID_AND_ATTRIBUTES 構造体ですが、このメンバ、Luid に何かを指定して、Attributes に SE_PRIVILEGE_ENABLED を指定すれば良さそうなのですが、Luid のどんな値が何を示すのかがわかりません。というより、再起動するごとに生成される?
順当には、削除対象のファイルのセキュリティ識別子を調べて、自分が書き込み権を持っているなら…のようになると思いますが、他に Windows Service を停止させる必要もあるので、「Administrators グループに属しているかどうか」であれば両方を一度に満足すると思います。
Google や LiveSearch で 「PrivilegeCheck」「プロセス administrator」「プロセス 管理者 (権限 OR 特権)」 などをキーに検索しましたが、該当するものを見つけられませんでした。
どのようにして調べればいいのでしょうか。
なお、Vista の場合は埋め込みマニフェストで requireAdministrator を指定しているので、問題ないと思っています。 「調べてダメなら…」は、他のアプリでは起動時に「権限がありません」と出しているので、「出せ」と言われています。このアプリはレジストリ(HKLM/SYSTEM)を Read/Write で開いて、失敗したら「権限なし」と判断しています。 (そこら中に転がっているような気がしたんだけど、見つけられなかった)
|