Process.Start code not working when trying to launch as a specified user

Brian
Brian used Ask the Experts™
on
I found this code that should run a program as a different user, but it errors and doesn't run the program.  Is there something I'm not doing correctly?
Imports System.Security
Imports System.ComponentModel

Module Module1

    Sub Main()
        Dim username As String = "MyUser"
        Dim password As SecureString = ConvertToSecureString("MyPassword")
        Dim domain As String = "MyDomain"
        Dim filename As String = "c:\windows\notepad.exe"
        Try
            System.Diagnostics.Process.Start(filename, username, password, domain)
        Catch ex As Win32Exception
            System.Windows.Forms.MessageBox.Show("Something went wrong!", "Error")
        End Try
    End Sub
    Function ConvertToSecureString(ByVal str As String)
        Dim password As New SecureString
        For Each c As Char In str.ToCharArray
            password.AppendChar(c)
        Next
        Return password
    End Function
End Module

Open in new window

Comment
Watch Question

Do more with

Expert Office
EXPERT OFFICE® is a registered trademark of EXPERTS EXCHANGE®
Senior Software Developer
Commented:
You need to use a ProcessstartInfo object like this: (Pardon my syntax here. I normally use C# and my VB is a little rusty)
Dim startInfo As ProcessStartInfo = New ProcessStartInfo("c:\windows\notepad.exe")
startInfo.UseShellExecute = false
startInfo.WorkingDirectory = "c:\windows"
startInfo.Verb = "runasuser"
startInfo.Domain = "MyDomain"
startInfo.UserName = "MyUser"
startInfo.Password = "MyPassword".ToSecureString
Dim runningProcess As Process = Process.Start(startInfo)
runningProcess.WaitForExit

Open in new window

The trick here is to use the "runasuser" verb and UseShellExecute as false.
BrianSystems Administrator

Author

Commented:
That's awesome!  Thanks Russ!  But I am getting an error for "MyPassword".ToSecureString.  The error is 'ToSecureString' is not a member of 'String'.  Maybe I need another Imports?
Russ SuterSenior Software Developer

Commented:
As I said, my VB is a little rusty. ToSecureString is a method. Perhaps it needs the parentheses () at the end?
Russ SuterSenior Software Developer

Commented:
DOH! It might have been helpful if I'd have included the Extension class declaration that houses the "ToSecureString()" method.
Public Class LocalExtensions
    
    Public Shared Function ToSecureString(this ByVal password As String) As SecureString
        Dim secure As SecureString = New SecureString
        For Each c As Char In password
            secure.AppendChar(c)
        Next
        Return secure
    End Function
End Class

Open in new window

I'm not 100% certain if extension classes are allowed in VB.NET so here's another version that should work just fine.
    Public Shared Function ToSecureString(ByVal password As String) As SecureString
        Dim secure As SecureString = New SecureString
        For Each c As Char In password
            secure.AppendChar(c)
        Next
        Return secure
    End Function

Open in new window

You'd just call that as a regular function like this:
startInfo.Password = ToSecureString("MyPassword")

Open in new window

BrianSystems Administrator

Author

Commented:
Thanks Russ for giving such clear and precise information!

Do more with

Expert Office
Submit tech questions to Ask the Experts™ at any time to receive solutions, advice, and new ideas from leading industry professionals.

Start 7-Day Free Trial