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

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

新規登録して質問してみよう
ただいま回答率
85.48%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

0回答

1929閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2021/03/08 11:52

前提・実現したいこと

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配下においてあり、どちらのユーザーもアクセスが可能な領域にいます。

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問