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

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

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

Re[5]: 自身を管理者権限にて起動ささせたい


(過去ログ 131 を表示中)

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

■77535 / inTopicNo.1)  自身を管理者権限にて起動ささせたい
  
□投稿者/ sa (3回)-(2015/10/30(Fri) 11:02:09)

分類:[VB.NET/VB2005 以降] 

2015/10/30(Fri) 11:02:31 編集(投稿者)
VB.NET
開発環境:Visual Studio Express 2013


(No77531の質問に関連して連投申し訳ないです)
フォーム上に配置したボタンからODBC登録を行えるようにしているのですが
管理者権限で起動しないと登録に失敗してしまいます。

調べてみたところ、マニフェストファイルのrequestedExecutionLevelを
requireAdministratorにすればよいとあったのですが、ClickOnceが有効になっているとNGになるようでした。

参考URL:http://okwave.jp/qa/q7347035.html

プロジェクトのセキュリティプロパティから、「ClickOnceセキュリティ設定を有効にする」の
チェックを外してみたのですが、結果は変わりませんでした。
上記URL内に記載されているMSDNのサイトも見てみたのですが、恥ずかしながら解決方法がわかりませんでした。


そこで別に、「アプリケーション開始時にrunasの動詞をつけて自身を管理者権限にて実行する」、
という記事を見つけましたので、ApplicationEventsに以下のように記載しました。

------------------------------------------------------
Namespace My

    Partial Friend Class MyApplication

        Private Sub MyApplication_Startup(ByVal sender As Object, _
            ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupEventArgs) _
            Handles Me.Startup
            '管理者として自分自身を起動する
            Dim psi As New System.Diagnostics.ProcessStartInfo()
            'ShellExecuteを使う。デフォルトtrueなので、必要はない。
            psi.UseShellExecute = True
            '自分自身のパスを設定する
            psi.FileName = System.Reflection.Assembly.GetExecutingAssembly().Location
            '動詞に「runas」をつける
            psi.Verb = "runas"

            Try
                System.Diagnostics.Process.Start(psi)
            Catch ex As System.ComponentModel.Win32Exception
                '「ユーザーアカウント制御」ダイアログでキャンセルされたなどによって
                '起動できなかった時
                Console.WriteLine("起動しませんでした: " & ex.Message)
            End Try

        End Sub

    End Class

End Namespace
--------------------------------------------------------
参考URL:http://dobon.net/vb/dotnet/system/asadmin.html


こうすると起動されたフォームのボタンからODBC登録が出来たため、管理者権限にて起動はしたのですが、
この後に続くフォームロード時に、またこのクラスが呼び出されているようで、無限ループに陥ってしまいました。

そこで、お聞きしたいのが以下の2点です。

・ClickOnceの設定で管理者権限起動を行うにはどのようにすればよいのか。
・上記MyApplicationクラスの記載で無限ループを回避するにはどのようにすれば良いのか。


恐縮ですが、お知恵を拝借頂ければと思います。

引用返信 編集キー/
■77551 / inTopicNo.2)  Re[1]: 自身を管理者権限にて起動ささせたい
□投稿者/ Azulean (533回)-(2015/10/30(Fri) 23:27:48)
個人的には、管理者権限が必要な時点で ClickOnce を選ばない方が良いとされていると思います。

理由
・ClickOnce は本来、管理者権限なしでアプリケーションをインストール・更新する仕組み
・共有ファイルやドライバーのインストールなど、他のユーザーに影響を与える(管理者権限が必要な)処理は「不可」と位置づけられている
from https://msdn.microsoft.com/ja-jp/library/e2444w33


本来進むべき道ではないと認識した上で、リスク覚悟で進むのであれば、
管理者権限があるかどうかを調べるとか、登録に成功するとか、オブジェクトの生成に成功するとか、管理者権限が不要と判断できる時点でその処理を呼ばないようにロジックを工夫すればよいのでは。
引用返信 編集キー/
■77562 / inTopicNo.3)  Re[2]: 自身を管理者権限にて起動ささせたい
□投稿者/ sa (4回)-(2015/11/02(Mon) 09:14:27)
No77551 (Azulean さん) に返信
> 個人的には、管理者権限が必要な時点で ClickOnce を選ばない方が良いとされていると思います。
>
> 理由
> ・ClickOnce は本来、管理者権限なしでアプリケーションをインストール・更新する仕組み
> ・共有ファイルやドライバーのインストールなど、他のユーザーに影響を与える(管理者権限が必要な)処理は「不可」と位置づけられている
> from https://msdn.microsoft.com/ja-jp/library/e2444w33
>
>
> 本来進むべき道ではないと認識した上で、リスク覚悟で進むのであれば、
> 管理者権限があるかどうかを調べるとか、登録に成功するとか、オブジェクトの生成に成功するとか、管理者権限が不要と判断できる時点でその処理を呼ばないようにロジックを工夫すればよいのでは。


Azuleanさん、丁寧なご回答ありがとうございます。
特に自分で意識していたわけでなく、最初からチェックが入っていたからというレベルでしたので、
御忠告頂いたように、CllickOnceは使用しない方向で行こうと思います。

そこで改めてご質問なのですが、ClickOnceの設定を無効化するにはどのようにしたらよろしいでしょうか。
前述したように、チェックボックスを外しただけでは動作として変化がありませんでした。

何か思い当たる点等がございましたら、ご助言頂ければと思います。
引用返信 編集キー/
■77563 / inTopicNo.4)  Re[3]: 自身を管理者権限にて起動ささせたい
□投稿者/ 魔界の仮面弁士 (548回)-(2015/11/02(Mon) 09:21:49)
No77562 (sa さん) に返信
> そこで改めてご質問なのですが、ClickOnceの設定を無効化するにはどのようにしたらよろしいでしょうか。

ClickOnce を使わずに配布する、ということで、
XCopy 配置あるいは Windows Installer での配置を
検討されては如何でしょう。


> psi.Verb = "runas"
> 無限ループに陥ってしまいました。

自己起動する場合は、コマンドライン引数を追加し、
それが付与されていた場合には、再々起動しないように If 判定するとか。
引用返信 編集キー/
■77565 / inTopicNo.5)  Re[4]: 自身を管理者権限にて起動ささせたい
□投稿者/ sa (5回)-(2015/11/02(Mon) 11:38:07)
No77563 (魔界の仮面弁士 さん) に返信
> ■No77562 (sa さん) に返信
>>そこで改めてご質問なのですが、ClickOnceの設定を無効化するにはどのようにしたらよろしいでしょうか。
> 
> ClickOnce を使わずに配布する、ということで、
> XCopy 配置あるいは Windows Installer での配置を
> 検討されては如何でしょう。
> 
> 
>>psi.Verb = "runas"
>>無限ループに陥ってしまいました。
> 
> 自己起動する場合は、コマンドライン引数を追加し、
> それが付与されていた場合には、再々起動しないように If 判定するとか。

魔界の仮面弁士 さん

ご回答ありがとうございます。

> ClickOnce を使わずに配布する、ということで、
> XCopy 配置あるいは Windows Installer での配置を
> 検討されては如何でしょう。

今回作成しているのは任意起動のツールという位置付けで、特に配布等は考えていません。
なので、余計にClickOnceは不要だということにはなりますね…


> 自己起動する場合は、コマンドライン引数を追加し、
> それが付与されていた場合には、再々起動しないように If 判定するとか。

上記ソースにArgumentsプロパティで引数を追記しましたが、上手く行きませんでした。
以下、変更したTryの部分になります。


01 Try
02     '起動する
03     If psi.Arguments <> "no" Then
04         MessageBox.Show("!")
05         System.Diagnostics.Process.Start(psi)
06         psi.Arguments = "no"
07     End If
08 Catch 〜

これに4行目にブレークポイントを仕掛けた状態で起動したところ、
ブレークポイントで一時停止→4行目のメッセージボックスの後、自己起動が走るのですが
5行目時点で再度「!」のメッセージボックスが表示された上、ブレークポイントで止まりませんでした。
更にその後は前述したように延々とループを繰り返していきます。

Process.Startで自身を起動すると、別物?となりデバッグ上では制御出来ないのでしょうか。
その後に続くフォームロードメソッド内でもブレークポイントで止めれない状況です。

何かお気付きの点がありましたら、ご教示頂ければ幸いです。

引用返信 編集キー/
■77566 / inTopicNo.6)  Re[5]: 自身を管理者権限にて起動ささせたい
□投稿者/ 魔界の仮面弁士 (549回)-(2015/11/02(Mon) 13:10:05)
No77565 (sa さん) に返信
> 03 If psi.Arguments <> "no" Then

psi.Arguments は、「これから起動するEXEに渡すパラメータ」であって、
「自身が渡されたパラメータ」ではないですよね。
受け取ったパラメータをチェックするようにしないと。

http://dobon.net/vb/dotnet/programing/commandline.html
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -