質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.37%

VB.NETで他のユーザーでプロセスを実行したい

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 252
退会済みユーザー

退会済みユーザー

前提・実現したいこと

VB.NETのProcess.startを使って、コンソールアプリからバッチファイルをキックしようとしています。

Process.start部分の動作を検証するために、こんなテストプログラムを書いて実行したところ、どちらもcmd.exeが起動し、それぞれwhoamiコマンドを実行すると、期待したユーザーで実行されていることが分かりました。

    <TestMethod()> Public Sub 自ユーザーでのCMD呼び出し()
        Dim _psi As New System.Diagnostics.ProcessStartInfo With {
            .FileName = "cmd.exe",
            .WorkingDirectory = ""
        }
        Dim p As System.Diagnostics.Process = System.Diagnostics.Process.Start(_psi)
    End Sub

    <TestMethod()> Public Sub 別ユーザーでのCMD呼び出し()
        Dim password As New System.Security.SecureString()
        For Each c As Char In "p@ssw0rd"
            password.AppendChar(c)
        Next

        Dim _psi As New System.Diagnostics.ProcessStartInfo With {
            .FileName = "cmd.exe",
            .UserName = "username",
            .UseShellExecute = False,
            .Domain = Nothing,
            .WorkingDirectory = "c:\",
            .Password = password
        }

        Dim p As System.Diagnostics.Process = System.Diagnostics.Process.Start(_psi)
    End Sub

そこで、最終的にプロセスをキックする部分の実装を、以下にしました。

    Public Function Execute(_dto)
        Dim _applicationRoot As String = My.Application.Info.DirectoryPath

        Dim _psi As New System.Diagnostics.ProcessStartInfo With {
            .FileName = _applicationRoot & "\" & _dto.BatName,
            .Arguments = """" & _dto.Query & """ """ & _dto.JobName & """",
            .WorkingDirectory = _applicationRoot,
            .ErrorDialog = False
        }

        If Not _dto.UserName Is Nothing Then
            Dim password As New System.Security.SecureString()
            For Each c As Char In _dto.PassWord
                password.AppendChar(c)
            Next

            _psi.UserName = _dto.UserName
            If _dto.Domain = "" Then
                _psi.Domain = Nothing
            Else
                _psi.Domain = _dto.Domain
            End If
            _psi.Password = password
            _psi.UseShellExecute = False
        End If

        Try
            Dim p As System.Diagnostics.Process = System.Diagnostics.Process.Start(_psi)
            If IsNothing(p) Then
                Return False
            Else
                Return True
            End If
        Catch ex As Exception
            Return False
        End Try

    End Function


また、動作確認のためどちらも同じバッチファイルを呼び出すようにしています。

ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /F "usebackq eol=; tokens=1 delims=, " %%A IN (`WHOAMI`) DO SET USERNAME=%%A
echo 実行ユーザー %USERNAME%

発生している問題・エラーメッセージ

呼び出し元のコンソールアプリケーションの画面に、キックされたプロセスのechoが表示されるのですが、別ユーザーで起動したechoが表示されません。また、ログファイルに記載するようにしてみましたが、やはり作成されません。

これらのプログラムは、c:\Users\Public配下においてあり、どちらのユーザーもアクセスが可能な領域にいます。

なぜ別ユーザーでは実行できないのでしょうか
それとも起動できていないことを検知しきれていないのでしょうか

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る