Link to home
Create AccountLog in
Avatar of Brian
BrianFlag for United States of America

asked on

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

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

ASKER CERTIFIED SOLUTION
Avatar of Russ Suter
Russ Suter

Link to home
membership
Create an account to see this answer
Signing up is free. No credit card required.
Create Account
Avatar of Brian

ASKER

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?
Avatar of Russ Suter
Russ Suter

As I said, my VB is a little rusty. ToSecureString is a method. Perhaps it needs the parentheses () at the end?
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

Avatar of Brian

ASKER

Thanks Russ for giving such clear and precise information!