« VBScriptでレジストリ操作 その1 | トップページ | 未来福音 »

2013年8月25日 (日)

VBScriptでレジストリ操作 その2 (その1の解説編)

Function GetOfficeVer(appName)
...
Function GetOSType()
...
Function GetIEVer()
...

については、他でも使える要素が高そうなので、有用かと。

ただし、「Function GetOfficeVer(appName)」については、既に問題が発覚していて、

複数のOfficeバージョンがインストールされており、 旧バージョン側を開くアプリケーションとして登録されている場合

ただしくそれを把握できなかった(らしい)。

直接そのマシン・状況を再現できないので、改良できるか現時点で不明。

なので、複数バージョンの場合は注意して下さい。

あとレジストリ操作のキモである

Function SetBrowserFlag()
...

については、

「On error resume next」を、削除対象のレジストリがない場合でも問題ないように敢えて記述しているところが、

ポイントといえばポイント。 サンプルには、「RegDelete」がないので、有り難みがないですけど。

※この記述がないと、削除対象のレジストリキーが無い場合、エラーとなります。

さて、スクリプト一番のポイントは

Shell.ShellExecute "wscript.exe","""" & WScript.ScriptFullName & """ uac","","runas"

の部分です。

Windows7(Vista)については、ユーザアカウント制御(UAC)が有効となっている場合、

RegDeleteやRegWriteといったコマンドは、本来管理者権限が必要であるのに、単にスクリプトをダブルクリック

しただけでは、ユーザ権限で実行されてしまうため、正しく処理が行えない、という壁があります。

素直に、

・ユーザアカウント制御の設定を「無効」にする

という方法もありますが、

・セキュリティ上問題があるケースが多い

・その操作の為のマニュアルを作成・配布しないといけない

・その操作中に、ユーザが誤操作をする可能性がある

というデメリットがある為、お勧めできない。

(そもそも、そんな方法でOKなら、レジストリを操作するマニュアルを作成・配布すればいい)

ということで、UACを操作することなく、管理者権限で実行させるために使っているのが

「runas」コマンドです。

do while Shell.ShellExecute "wscript.exe","""" & WScript.ScriptFullName & """ uac","","runas"

つまり上記は、管理者権限で、自分自身を、第1引数「uac」をつけて、再起動を行っているコマンドです。

この第1引数「uac」に意味はありません。

大事なのは、「1つ(以上)引数を付けて起動する」という点です。

1つ以上引数を付けて挙動を変えている部分が、

do while WScript.Arguments.Count=0
...
loop

上記の部分です。

この「do...loop」間に書かれたコマンドは、引数がない場合(0個)のみ実行されるという 意味を持っています。

なので、

・初回起動時(エンドユーザがダブルクリック時)は、引数なし(0個)

 →「runas」にて、管理者権限で自分自身を、第1引数「uac」をつけ起動し直して、終了。

・自分自身が自分自身を起動した場合は、第1引数があるので、

 →更なる自分自身の起動は行わず、以降のレジストリ操作部分に突入

 →レジストリ操作が管理者権限で実行される。

 →正しく実行される

という順になります。

一種の権限昇格を行うサンプルということも出来るかも知れません。

|

« VBScriptでレジストリ操作 その1 | トップページ | 未来福音 »

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/538346/58064725

この記事へのトラックバック一覧です: VBScriptでレジストリ操作 その2 (その1の解説編):

« VBScriptでレジストリ操作 その1 | トップページ | 未来福音 »