Win7でアドミニユーザーでのレジストリ書込について

[戻る]
よしぃ 2010/08/16(月) 21:27:10
OSはWindows7で、
RegSetValueEX関数を使用して、レジストリに値を書込もうとしています。
そのとき、
ユーザーが、Administratorなら成功しますが、
Admini権限を持ったユーザーだと失敗します。
おそらく、UACのせいだと思うのですが、
Adminiユーザーでも、レジストリに書込む、良い方法はないでしょうか?

UACをOFFにする設定をREGEDITで書き込むと、
Adminiユーザーでも、書込めるようになりますが、
そもそも、Adminiユーザーで
RegSetValueEXを使用してレジストリに書き込めないため、
OFFにできません。

開発環境はVC++です。
よろしくお願い致します。

MistyGreen 2010/08/17(火) 08:05:59
普通に起動したアプリではHKEY_CLASSES_ROOT以下のエントリーなどに
書き込めないという意味でしょうか?

これはWindowsのセキュリティ仕様ですのでどうしようもないと思います。

一般的な対策としては、レジストリに対してそのような書き込みを行う
必要のあるアプリは、管理者権限モードで起動させるようなマニフェストを
追加しておくのがいいと思います。

このようにすると、アプリの起動時に自動的にUACのダイアログが表示されて
権限の昇格が求められるようになります。ユーザーが許可して
アプリを起動すれば、レジストリの書き換えも可能になります。

以下のサイトが参考になると思います。
http://www.atmarkit.co.jp/fdotnet/dotnettips/958uacmanifest/uacmanifest.html

「requireAdministrator」を指定すれば大丈夫だと思います。

また、VS2010(VS2008は未確認です)であれば、マニフェストファイルを
直接編集しなくても、プロジェクトの管理ダイアログから設定できます。

PATIO 2010/08/17(火) 11:30:20
レジストリに書き込むのが必須なのかと言う部分も
考慮した方が良さそうな気がします。

流れとしてはアプリの設定情報の保持にレジストリを
使わない方向になっていると思うので方法論を変える
方向で考えた方が良いのではないかなと。

.NET Frameworkでは設定情報はxmlファイル形式で
書き込み権がある場所に保存する事になっているので
そちらの方式を参考にした方が良いかもしれません。

レジストリに登録しないと仕組み上動かないと言う話なら
仕方ないと思いますけれど。

aetos 2010/08/17(火) 19:53:03
Win7 であれば管理者権限でなくても HKEY_CLASSES_ROOT には書き込めるはずです。
HKEY_CLASSES_ROOT とは実体を持たない仮想キーで、実体は HKEY_CURRENT_USER \ 
Software \ Classes と HKEY_LOCAL_MACHINE \ Software \ Classes がマージされたも
のです。
管理者権限でなければ HKCU の方に書き込まれます。

HKCU 以下には通常ユーザー権限でも書き込み可能です。

ということは、管理者権限でなければ書き込めないキーとは HKLM ということになるわ
けですが(まさか HKEY_USERS ではないでしょう)。
アプリを通常運用していて HKLM に書き込む必要があることはそうそうないはずです。
あるとすれば、一般的にはインストール時くらいのもので、インストーラは管理者権限
で実行するのが普通なので問題になりません。

いったいどういうシナリオで、どこのキーに書き込もうとしているのでしょうか?

よしぃ 2010/08/19(木) 22:46:22
[[解決]]
記述したかったレジストリは、
HKEY_LOCAL_MACHINE
部分です。
環境設定をレジストリで
強制的に行おうという考えです。

単に管理者権限での実行の問題でした。
「requireAdministrator」
の設定で解決しました。

ありがとうございました。

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