none
processを使って管理者権限でのコマンド実行と標準出力のリダイレクト RRS feed

  • 質問

  • お世話になります

    タイトル通りなのですが、processの挙動がどうも管理者権限が必要なコマンドだとうまく動きません

    この例では「route print」にすれば出来ますが「route add」にするとどうしても動きません。

    中段でコメントアウトしている管理者権限のあるIDとパスワードでの起動を試みた所、②でブレークポイントで止めてwaitforexitの行でmyprocessの内容をみたところ、exit codeがどうしても「1」となり、標準出力やエラー出力もnullになっているようです。

    管理者権限のユーザIDを指定したprocessでコマンド実行は出来ないのでしょうか?

    すみませんがご教授お願い致します。

            myprocess.StartInfo.FileName = "route"                    
            myprocess.StartInfo.Arguments = "add"           ' ----------①
            myprocess.StartInfo.RedirectStandardOutput = True
            myprocess.StartInfo.RedirectStandardError = True
            myprocess.StartInfo.CreateNoWindow = False
            'myprocess.StartInfo.Verb = "runas"

            'myprocess.StartInfo.UserName = "admin"
            'myprocess.StartInfo.LoadUserProfile = True

            'Dim pw As SecureString = New SecureString
            'For Each ch In "dummy".ToCharArray()
            '    pw.AppendChar(ch)
            'Next
            'myprocess.StartInfo.Password = pw

            myprocess.StartInfo.UseShellExecute = False

            Try
                Dim line As String
                Dim fileOut As String
                Dim envline As Array
                Dim myGuid As Guid
                Dim cnt As Integer = 0
                Dim dt As DateTime

                myprocess.Start()                                        '------------------②
                myprocess.WaitForExit()
                If myprocess.ExitCode <> 0 Then
                    Response.Redirect("ErrorPage.aspx")
                End If
                Do Until myprocess.StandardOutput.EndOfStream
                    line = myprocess.StandardOutput.ReadLine()
                Loop

                Catch ex As Exception
                    Console.WriteLine("Error! {0}", ex.Message)
                    If ex.Message <> "Thread was being aborted." Then
                        Response.Redirect("ErrorPage.aspx")
                    End If
                Finally
                    myprocess.Dispose()
                End Try

                Response.Redirect("NextPage.aspx")



    2013年9月19日 12:46

回答

  • なんとか自己解決しました。

    serverのaspのaplicationプールのモードをclassicにして、web.configに

      <system.web>要素の下に

        <identity impersonate="true" />

    を追加で可能になりました。

    2013年9月23日 12:46

すべての返信

    • UseShellExecuteがTrueの場合、標準入出力は使用できないはずです。
    • Verb=RunAsを有効にするにはUseShellExecuteをTrue(既定値)にする必要があります。

    ということで、多分両立はできません。

    間にもう一つ自作のプロセスXを挟んで、

    1. プロセスXをRunAsで起動
    2. プロセスXはUseShellExecute=Falseで目的のプロセスを実行
    3. 標準出力をリダイレクトしてプロセスXが結果取得
    4. プロセスXは何らかのプロセス間通信で元プロセスに結果を返す

    という手順を踏む手法を思いつきました。

    2013年9月19日 13:45
  • おせわになります

    サーバ側の設定でUACを殺してもらったのでVerbs="runas"の必要をなくしましたが、管理者に成り代わってのプロセス実行でまだ別なもんだが出てしまいます。

    ローカルPCでの挙動はOKなのですが、サーバで同じものを実行するとコマンドの実行結果が-1073741502で返ってきます。これは実際に実行したいexe(製品のexeです)でも仮にnotepadに変更しても同じくPCはOK、サーバではNGでした。

    このエラーコードで検索してみましたが

    0xC0000142,-1073741502,STATUS_DLL_INIT_FAILED

    ということだったのでDLLの初期化失敗という事なのでしょうが、どのDLLが原因なのかさっぱりわかりません。

    何かヒントでもいただけないでしょうか?

    よろしくお願いいたします。

    (追記)

    //ja.softuses.com/222036
    上のページがこのエラーを解説していそうなのですが自動翻訳でよくわかりませんでした・・
    2013年9月20日 5:53
  • ともだまさひろ さま よろしく。

    あるいはピント外れかも知れませんが ... 。
    UserName = "admin" はサーバー側で コマンド実行に必要とされる権限を持っていますか。
    サーバーでのユーザーのアクセス権はクライアントのそれと異なっていたような気がするのですが。
    例えば、ユーザーを組込 Administrator にしないと動かないとか。

    2013年9月20日 9:40
  • ShiroYuki_Motさま

    adminユーザはサーバーローカルのAdministratorグループに所属しています。

    debug用に出力されたコンソールログに実行コマンドを表示しているのですが、そのコマンドをそのユーザでrunasしたコマンドプロンプトで下記のように実行したところ、普通にエラー無く実行できます。

    リモートデスクトップユーザでログオン→コマンドプロンプト→runas /usr:admin→パスワードの入力→

    出力されたFileとargumentをコマンドプロンプトに貼り付けて実行→期待された結果が出力される。

    こんな状況で困っています・・・・。

    2013年9月20日 9:59
  • なんとか自己解決しました。

    serverのaspのaplicationプールのモードをclassicにして、web.configに

      <system.web>要素の下に

        <identity impersonate="true" />

    を追加で可能になりました。

    2013年9月23日 12:46