C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[10]: UACメッセージを回避したい


(過去ログ 140 を表示中)

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■82175 / inTopicNo.1)  UACメッセージを回避したい
  
□投稿者/ くまもんもん (5回)-(2016/12/14(Wed) 16:37:29)

分類:[.NET 全般] 

win、XPwin7、win8.1、win10
vs2015Pro

お世話になります。

管理者権限でコマンドプロンプトを起動するVBScriptを書いたつもりなのですが、
実際に叩くと、UACの確認メッージが表示されてしまいます。


メッセージを出さずに、管理者権限でコマンドプロンプトを起動する
VBScriptをご教授願えませんでしょうか?

以下が、NGであろうスクリプトです。
----------------------------------------------------------------------------------------------------
Set obj = CreateObject("Shell.Application")
Set WshShell = CreateObject( "WScript.Shell" )
if WScript.Arguments.Count <> 0 then
obj.ShellExecute "cmd.exe", "/s /k pushd """ & WScript.Arguments(0) & """", "", "runas", 1
else
obj.ShellExecute "cmd.exe", "/s /k pushd """ & WshShell.CurrentDirectory & """", "", "runas", 1
end if
----------------------------------------------------------------------------------------------------

よろしくお願いします。
引用返信 編集キー/
■82182 / inTopicNo.2)  Re[1]: UACメッセージを回避したい
□投稿者/ Hongliang (479回)-(2016/12/14(Wed) 21:01:36)
それができてしまうと言うことは、マルウェアも同じ方法でUACをかいくぐれてしまうわけで、もはやUACの存在意義がなくなってしまいます。
引用返信 編集キー/
■82195 / inTopicNo.3)  Re[2]: UACメッセージを回避したい
□投稿者/ くまもんもん (7回)-(2016/12/15(Thu) 16:31:44)
No82182 (Hongliang さん) に返信
> それができてしまうと言うことは、マルウェアも同じ方法でUACをかいくぐれてしまうわけで、もはやUACの存在意義がなくなってしまいます。

そうですね。別案で対応します。

それとは別件で質問です。

カスタム動作(Install,Commit,Rollback,Uninstall)ではなく、
msiもしくはexe起動時にあるVBScriptを実行したいのですが、
どう実現させたらよいのでしょうか?

普通のクラスを追加してstatic void main()で処理を書きましたが
動いてないようです。

カスタムアクションのInstallの前にやりたいことがありまして。。。

installer Prjectは通常のプロジェクトとは違う構成のようで
良くわかりません。

引き続きご教授お願いいたします。

引用返信 編集キー/
■82196 / inTopicNo.4)  Re[3]: UACメッセージを回避したい
□投稿者/ とっちゃん (412回)-(2016/12/15(Thu) 18:01:18)
No82195 (くまもんもん さん) に返信
> それとは別件で質問です。
>
> カスタム動作(Install,Commit,Rollback,Uninstall)ではなく、
> msiもしくはexe起動時にあるVBScriptを実行したいのですが、
> どう実現させたらよいのでしょうか?
>
msi からというのは、インストール時のカスタム動作の直前に VBS を実行したいということですか?

確かに、msiには VBS を Custom Acdtionsとして登録して実行する仕組みがあります。
ですが、VSのインストーラ作成プロジェクトは、インストーラクラスを使う
カスタム動作しか、カスタムアクションをサポートしていません。
どうしても使いたい場合は、後から追加する形での対応となります。

ですが、インストーラクラスを使っているということは、C#あるいはVBでコードを書いているということですよね?
であれば、その中で、VBSでやっていることと同じことをコーディングする方がいいと思います。

それらを、本体のプログラムからも呼び出せるように作っておけば exe/msi の区別なく呼び出しできます。
引用返信 編集キー/
■82207 / inTopicNo.5)  Re[4]: UACメッセージを回避したい
□投稿者/ 強チェ (1回)-(2016/12/16(Fri) 17:55:44)
ところで、Installの前にどんなことをやりたいのでしょうか?
何か条件を判断するとか?
その条件により何かを変えるとか?
引用返信 編集キー/
■82215 / inTopicNo.6)  Re[5]: UACメッセージを回避したい
□投稿者/ くまもんもん (9回)-(2016/12/18(Sun) 05:49:06)
遅くなりました。すみません。

とっちゃんさん、とても詳細な回答ありがとうございました。
強チェさん、質問ありがとうございます。

あれから右往左往して、vbsでやりたかったことは
もともとMSIのCustomActionテーブルで設定したC++で作成したDLL内のプログラム内に組み込むことにしました。
※このC++のDllはインストール前にしたいある処理です。
更にC++のDll内で、C#で作成したCOMを呼び出しています。

ここで、またしても問題にぶちあたりました。

COM呼び出しのために、C++のDLL側からRegCreateKeyExとRegSetValueExを使用して
HKEY_CLASSES_ROOTにキーの作成と値の登録を行いたいのですが、
管理者権限に上昇してのやり方が分からず、煮詰まっています。

上記の質問の前にそもそも論の質問です(いろいろネット調査はしたのですが分からず…)。

C#のプロジェクトプロパティ
 アプリケーション→アセンブリ情報→アセンブリをCOM参照可能にするにチェック
 ビルド→COM相互運用機能の登録にチェック
 
この条件下でビルドし、レジストリに作成されるキーの場所は
HKEY_CLASSES_ROOT配下のように見受けられるのですが、これは仕様ですか?
それともどこかの設定なのでしょうか?

仕様で、COMのCLSIDのキー情報はHKEY_CLASSES_ROOTにまとめるもの?…

であれば、HKEY_CLASSES_ROOTにキーを作成するには管理者権限が必要で
C++のソース上でそれを実現するには、レジストリへのアクセス許可を変えるとか
管理者権限に上昇してから登録を行うとかいろいろやる必要がある模様。
C++は今回初めて触ったので、文法が慣れず、歩みも遅くしかも進めない。
限界にたっしたので、ここへ質問投げました。

インストール前にやりたいことは、HKEY_CLASSES_ROOTへのキー登録の後に
CustomActionの実行です。
CustomAction単体では動作確認済みでOKです。
後はHKEY_CLASSES_ROOTへのキー登録です。

どうか、どうか、ご教授お願い致します。

引用返信 編集キー/
■82216 / inTopicNo.7)  Re[6]: UACメッセージを回避したい
□投稿者/ Azulean (746回)-(2016/12/18(Sun) 07:57:08)
No82215 (くまもんもん さん) に返信
> COM呼び出しのために、C++のDLL側からRegCreateKeyExとRegSetValueExを使用して
> HKEY_CLASSES_ROOTにキーの作成と値の登録を行いたいのですが、
> 管理者権限に上昇してのやり方が分からず、煮詰まっています。

そのやり方でもできるかもしれませんが、レジストリに何が登録されて、どういう意味があるのかを理解せずにやると被害が広がるだけな気がします…。


> この条件下でビルドし、レジストリに作成されるキーの場所は
> HKEY_CLASSES_ROOT配下のように見受けられるのですが、これは仕様ですか?

昔からそういう仕様です。


> C++は今回初めて触ったので、文法が慣れず、歩みも遅くしかも進めない。
> 限界にたっしたので、ここへ質問投げました。

Visual Studio インストーラーのカスタムアクションは C# でも書けるはずなんですが、あえて C++ 路線に舵を切った理由はあるのでしょうか?



COM 登録だけだったら、ファイルを選択したときの Register プロパティで行けるような気がしますが、ダメでした?
https://msdn.microsoft.com/ja-jp/library/ddtk4a95
https://msdn.microsoft.com/ja-jp/library/z5s1e2wh
引用返信 編集キー/
■82217 / inTopicNo.8)  Re[7]: UACメッセージを回避したい
□投稿者/ くまもんもん (11回)-(2016/12/18(Sun) 09:29:40)
Azulean さんありがとうございます。

> Visual Studio インストーラーのカスタムアクションは C# でも書けるはずなんですが、あえて C++ 路線に舵を切った理由はあるのでしょうか?

ユーザー情報画面でのシリアル番号チェックでサンプルにあったソースが
どこもかしこもC++だったもので、呼び出しにはアンマネージコードのみなのかなと。
もう組み込んで動きもうまくいっているので、このままいく予定です。

> COM 登録だけだったら、ファイルを選択したときの Register プロパティで行けるような気がしますが、ダメでした?
> https://msdn.microsoft.com/ja-jp/library/ddtk4a95
> https://msdn.microsoft.com/ja-jp/library/z5s1e2wh

2サイトとも、「トピックは利用できなくなりました」でした。。。

No82216 (Azulean さん) に返信
> ■No82215 (くまもんもん さん) に返信
>>COM呼び出しのために、C++のDLL側からRegCreateKeyExとRegSetValueExを使用して
>>HKEY_CLASSES_ROOTにキーの作成と値の登録を行いたいのですが、
>>管理者権限に上昇してのやり方が分からず、煮詰まっています。
>
> そのやり方でもできるかもしれませんが、レジストリに何が登録されて、どういう意味があるのかを理解せずにやると被害が広がるだけな気がします…。
>
>
>>この条件下でビルドし、レジストリに作成されるキーの場所は
>>HKEY_CLASSES_ROOT配下のように見受けられるのですが、これは仕様ですか?
>
> 昔からそういう仕様です。
>
>
>>C++は今回初めて触ったので、文法が慣れず、歩みも遅くしかも進めない。
>>限界にたっしたので、ここへ質問投げました。
>
> Visual Studio インストーラーのカスタムアクションは C# でも書けるはずなんですが、あえて C++ 路線に舵を切った理由はあるのでしょうか?
>
>
>
> COM 登録だけだったら、ファイルを選択したときの Register プロパティで行けるような気がしますが、ダメでした?
> https://msdn.microsoft.com/ja-jp/library/ddtk4a95
> https://msdn.microsoft.com/ja-jp/library/z5s1e2wh
引用返信 編集キー/
■82218 / inTopicNo.9)  Re[8]: UACメッセージを回避したい
□投稿者/ Azulean (747回)-(2016/12/18(Sun) 09:49:29)
2016/12/18(Sun) 09:50:04 編集(投稿者)

必要ない箇所の引用は削ってください。
上下に長くなって見づらくなるだけで、メリットがないためです。

No82217 (くまもんもん さん) に返信
> 2サイトとも、「トピックは利用できなくなりました」でした。。。

失礼。
https://msdn.microsoft.com/ja-jp/library/ddtk4a95%28v=vs.100%29
https://msdn.microsoft.com/ja-jp/library/z5s1e2wh%28v=vs.100%29

// 「その他のバージョン」のリンクからたどれば見えるんですけどね…。
// あとは、キーワードで探すのも手ですよー。

引用返信 編集キー/
■82223 / inTopicNo.10)  Re[9]: UACメッセージを回避したい
□投稿者/ くまもんもん (12回)-(2016/12/18(Sun) 11:46:54)
> 必要ない箇所の引用は削ってください。
> 上下に長くなって見づらくなるだけで、メリットがないためです。

す、すみません。。


> https://msdn.microsoft.com/ja-jp/library/ddtk4a95%28v=vs.100%29
> https://msdn.microsoft.com/ja-jp/library/z5s1e2wh%28v=vs.100%29
>
> // 「その他のバージョン」のリンクからたどれば見えるんですけどね…。
> // あとは、キーワードで探すのも手ですよー。

ありがとうございます。
【インストール時(若しくはインストール後)】では遅いんです。
【インストール前】できればユーザー情報画面の次へボタン押下前までに
COM登録したいのです。しかもHKEY_CLASSES_ROOTに。

 RegistryKey::SetAccessControl メソッド とか見てるのですが、文法が難しく。

 C++から管理者権限でHKEY_CLASSES_ROOT配下にキー情報を作成&登録できれば
 同C++の後続処理でCOMのCLSIDを取得でき参照でき、こちらの望む処理へと続くのです。

 ビルドしてCOM自動登録された時は、上記の一連の動作はすんなり行きます。
 インストーラーを作っているわけで、インストール時に手動でレジストリキーを作成するわけにも行かず、
 自動化したいんです。

 RegistryKey::SetAccessControl メソッドなどをもう少々ググってみます。
 
 
引用返信 編集キー/
■82224 / inTopicNo.11)  Re[10]: UACメッセージを回避したい
□投稿者/ Azulean (749回)-(2016/12/18(Sun) 11:53:05)
2016/12/18(Sun) 20:54:23 編集(投稿者)

No82223 (くまもんもん さん) に返信
> 【インストール時(若しくはインストール後)】では遅いんです。
> 【インストール前】できればユーザー情報画面の次へボタン押下前までに
> COM登録したいのです。しかもHKEY_CLASSES_ROOTに。

そういうシナリオは想定されていないと思います。
どうしても目指すのなら、必須コンポーネントとしてパッケージングすればできるかもしれません。
ただし、その場合でもネイティブコードで作ることが必要になると思いますが…。
仮に実現できたとして、インストーラを途中でキャンセルしても、その COM は残り続けることになります。インストーラーのために必要な COM が残ること、それが良いのか?は疑問に感じます。
自分のコードでレジストリに書く以上、誰もそれを消してくれませんので。


そもそも、なぜ、その時点で COM を必要としているのでしょうか?
ユーザー情報入力画面で何らかのカスタマイズをしたかったとしても、COM である必然性が見えません。


-----
以下の部分は、別の方の話を混ぜて書いてしまっていたので改稿しました。

No82223 (くまもんもん さん) に返信
>  RegistryKey::SetAccessControl メソッド とか見てるのですが、文法が難しく。

そのメソッドを使うと言うことは、C++ ではなく、C++/CLI になっています。
その方針で許されるのなら、C# を COM 経由で呼ぶのではなく、C# を C++/CLI 経由で呼ぶように変えた方が楽ですよ。
引用返信 編集キー/
■82227 / inTopicNo.12)  Re[10]: UACメッセージを回避したい
□投稿者/ とっちゃん (413回)-(2016/12/19(Mon) 11:09:14)
No82223 (くまもんもん さん) に返信
>>// 「その他のバージョン」のリンクからたどれば見えるんですけどね…。
>>// あとは、キーワードで探すのも手ですよー。
>
> ありがとうございます。
> 【インストール時(若しくはインストール後)】では遅いんです。
> 【インストール前】できればユーザー情報画面の次へボタン押下前までに
> COM登録したいのです。しかもHKEY_CLASSES_ROOTに。
>
別製品のインストーラとして作成しておき
必須コンポーネントで事前にインストールしておく必要があります。


>  RegistryKey::SetAccessControl メソッド とか見てるのですが、文法が難しく。
>
>  C++から管理者権限でHKEY_CLASSES_ROOT配下にキー情報を作成&登録できれば
>  同C++の後続処理でCOMのCLSIDを取得でき参照でき、こちらの望む処理へと続くのです。
>
管理者権限の取得は、昇格して(UAC画面を出して)、プロセスレベルで取得する必要があります。

SetAccessControl などのAPIを呼び出しても取得できません。

SetAcessControl は、そのレジストリキーにアクセスできるユーザーグループや権限を設定します。
ちなみに、HKEY_CURRENT_USER で別ユーザーに権限をセットできたとしても
それは有効にはならないので注意してください(HKEY_CURRENT_USER はそのユーザーアカウント内でしか
ロードされないレジストリデータ)。

それと、CustomActions(CA)には、管理者権限で動作する仕組みが存在しますが
管理者権限で動作できるのは、インストールボタンが押された後のインストール中の
処理の一部の期間だけとなります。
UI画面から呼び出すCAを一時的にであっても管理者権限で動作させることはできません。


>  ビルドしてCOM自動登録された時は、上記の一連の動作はすんなり行きます。
>  インストーラーを作っているわけで、インストール時に手動でレジストリキーを作成するわけにも行かず、
>  自動化したいんです。
>
COMサーバーを使いたいなら、あらかじめCOMサーバーを「インストール」しておく必要があります。

あと、COMサーバーとは関係ありませんが、VSのインストーラプロジェクトにある
カスタム動作は、インストールしたファイルを呼び出す機能なので、インストール前は使えません。
恐らくそのあたりから巡り巡ってという気はしますが。。。


ここからは余談。

C#のコードを呼び出したいだけなのであれば、WiX のカスタムアクション作成サポートの機能に
C#で通常のCAと同じ仕組みのものをつくるプロジェクトテンプレートがあります。
VSのセットアッププロジェクトへもあとから追加する形で組み込み可能だと思います。
そちらを検討してもいいかもしれません。

ただし、日本語情報は見たことがないので(そもそも国内で使ったことがある人がどれくらいいるかレベル)
英語の文献や、ソースコードを頼りに開発ということになる点だけはあらかじめ配慮しておく必要はあると思います。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -