前提・実現したいこと
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配下においてあり、どちらのユーザーもアクセスが可能な領域にいます。
なぜ別ユーザーでは実行できないのでしょうか
それとも起動できていないことを検知しきれていないのでしょうか
あなたの回答
tips
プレビュー