DOBON.NET DOBON.NETプログラミング掲示板過去ログ

レジストリからUACの無効化

環境/言語:[Windows7、C++、簡単インストーラ Ver.2.45.0.1]
分類:[インストーラ]

はじめまして、サラダぱんと申します。

早速本題なのですが、

Windows7のUAC設定をレジストリから変更したいのですが、できずに悩んでおります。
※手動でレジストリエディタからってのはナシで・・・

背景ですが、
現在作成したプログラムのインストーラを「簡単インストーラ」にて作成中でして、
そのプログラムの仕様がUACをOFFにするのが必要ということで、
「簡単インストーラ」のレジストリ設定でUAC機能をOFFにし、
プログラムをインストールするとUACがOFFになっている状態にしたいのです。
自分でも調べて挑戦しているのですが、八方塞がりになってしまいました・・・

設定した内容としては、下記の通りなのですが設定が間違っているでしょうか?
申し訳ありませんが、ご存知のかたいらっしゃればご教授お願いいたします。

設定内容
ルートキー:HKEY_LOCAL_MACHINE
サブキー:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System
値名:ConsentPromptBehaviorAdmin
値の種類:整数(REG_DWORD)
値:0
■No27652に返信(サラダぱんさんの記事)
> 現在作成したプログラムのインストーラを「簡単インストーラ」にて作成中でして、
> そのプログラムの仕様がUACをOFFにするのが必要ということで、
> 「簡単インストーラ」のレジストリ設定でUAC機能をOFFにし、
> プログラムをインストールするとUACがOFFになっている状態にしたいのです。

お聞きしてみたいのですが、そのインストーラーはどの程度配布・展開するつもりですか?
社内・組織内など、閉じられた環境で UAC OFF によるリスクを考慮した上で情報担当者や責任者が容認しているのなら止める理由はありませんが…。

広く配布するつもりなら、プログラムを修正することを考えてください。
>Azulean様

インストーラ自体は一定の閉じられたPCにインストールされるもので、
責任者がリスクを踏まえた上で容認されています。

そのため、このままUACのoffを行なう予定です。
ちなみに手動でレジストリエディタを操作した場合には、
正しくUACがOFFになります。
■No27678に返信(サラダぱんさんの記事)
> ちなみに手動でレジストリエディタを操作した場合には、
> 正しくUACがOFFになります。

  レジストリの変更をプログラムから行うには、そのプログラムに
  既に管理者権限が必要です。

  管理者権限が無いので、失敗して変更がなされていないだけでは
  ないでしょうか?

以上。
>オショウ様

ご助言ありがとうございます。
インストーラを実行する際に確認ダイアログがでるため、
管理者権限に昇格していると思っていました。

実行時の権限を確認したいと思います。
> 実行時の権限を確認したいと思います。

  あと・・・
  レジストリを変更できても、再起動しないとシステム(OS)
  に反映されないかと・・・

以上。
>オショウ様

インストーラファイルを右クリックで、
管理者権限でインストールしてみましたがダメでした・・・
(再起動も行いました)

ん〜設定値が悪いのかも知れません・・・
もう一度最初から見直してみます。
> インストーラファイルを右クリックで、
> 管理者権限でインストールしてみましたがダメでした・・・
> (再起動も行いました)

  http://journal.mycom.co.jp/column/windows/067/index.html

  ここに、
  本操作は管理者権限を持つアカウントでのみリアルタイムに反映されます
  ので注意してください。

  と、

  ただしレベル1以下はモーダルダイアログを用いたセキュアデスクトップが
  無効になりますので、同環境を制御するDWORD値「PromptOnSecureDesktop」
  の操作も必要です
  
  とあります。

  ご確認下さい。

※ 実際のところ、UACをオフにしないといけない最大の理由は何
  でしょうか。管理者権限を有する機能をプログラム中から操作す
  るので・・・ということですか?

以上。
>オショウ様

ご助言ありがとうございます。

>※ 実際のところ、UACをオフにしないといけない最大の理由は何
>  でしょうか。管理者権限を有する機能をプログラム中から操作す
>  るので・・・ということですか?

すごくシンプルなことなのですが・・・
このプログラムが処理結果をファイル出力しており、
出力先がProgramFiles配下でなければダメという制約のためです。

正直言ってダサイ作りなのですが、
今回は致し方なくといったところです・・・

ポリシー等を変更すればよい気もするのですが、
UACを無効化で対応することになりました。
> すごくシンプルなことなのですが・・・
> このプログラムが処理結果をファイル出力しており、
> 出力先がProgramFiles配下でなければダメという制約のためです。

  私は、インストーラが起動した折、UACにより管理者権限を
  有する状態になった時点で、インストール先パスに対し、書き
  込み権限をそのパスに設定することで逃げたことがあります。

  その方がUACをオフにするよりもリスクが低い・・・
  と言う話になったので。

※ もしくは、管理者権限を有しているインストール中に、タスク
  マネージャに管理者権限を有する『とあるプログラム』の起動
  設定を行い、ログオン時にそのタスクを常駐プログラムとして
  起動させて、プロセス間通信で必要な情報を連携するようにす
  れば、書き込みができるんじゃ〜ないかナ〜

  UACをオンでも、行う方法はいくらでもあるかと。

以上。参考まで
> ※ もしくは、管理者権限を有しているインストール中に、タスク
>   マネージャに管理者権限を有する『とあるプログラム』の起動
>   設定を行い、ログオン時にそのタスクを常駐プログラムとして
>   起動させて、プロセス間通信で必要な情報を連携するようにす
>   れば、書き込みができるんじゃ〜ないかナ〜

  タスクスケジューラの間違いネ!・・・

以上。修正
[マニフェストファイルで管理者権限を付与]とかはどうですか?
http://gushwell.ldblog.jp/archives/51796717.html
皆様、ご助言ありがとうございます。

>オショウ様
レジストリ値についての情報ありがとうございます。
確かにフォルダに対して権限付与という手もありますね。

>GOD様
ご助言ありがとうございます。
プログラムの実行権限が管理者になればアクセスできるのですかね・・・?
てっきりProgramFilesへのアクセス権とは関係ないのかと思い込んでおりました。
再度確認したいと思います。

私用にて一週間ほど確認が行なえないため、
また後日結果を報告させていただきます。
■No27716に返信(サラダぱんさんの記事)
> このプログラムが処理結果をファイル出力しており、
> 出力先がProgramFiles配下でなければダメという制約のためです。

Program Files に書き込むという仕様が不可避なのであれば、以下のいずれかでしょうか。

・管理者権限を持つプログラムとして実行するようにマニフェストを書く。
・出力先のフォルダのアクセス権を実行ユーザーに認めるように設定する。

Program Files 以下のフォルダは、Administrators グループには書き込み権限がありますが、通常のユーザーが属する Users グループは読み取り権限のみです。
管理者権限として実行すれば、Administrators に認められている権限が行使できるはずです。


ちなみに、UAC OFF にした場合であっても、管理者グループに属さないユーザーは Program Files に書き込めません。
この場合、アクセス権を変更するほか、対応方法はありません。
>Azulean様
ご助言ありがとうございます。

結論からすると、UAC機能をoffにすることで対応しました。

UACのレジストリ値OFFは設定項目と設定方法が間違っておりました・・・
散々言った挙句初歩的ミスでした。

正直言って、ダサい仕様になりましたが、
数ヵ月後に大改修を行うことになりましたので、
ProgramFiles以下への書込みという仕様自体を変えたいと考えています。

皆様本当にご助言ありがとうございました。
良い勉強をさせていただきました。

失礼します。

DOBON.NET | プログラミング道 | プログラミング掲示板