Feedback

Anwendung unter XP/Vista als Admin starten

Sprache: VB

In Vista™ ist eine Technik namens User Account Protection dafür verantwortlich, dass Prozesse standardmäßig keine Administrator Rechte haben – selbst wenn man als Administrator angemeldet ist. Es gibt eine Möglichkeiten, einen Prozess doch mit Admin Rechten zu starten. Hier wird die Klasse System.Security.SecureString dafür verwendet, ein Password zu späteren Verwendung sicher zu speichern. Auf das Formular müssen 2 Textboxen txtUser und txtPass und ein Button. Bei txtPass sollte PasswordChar auf * stehen. Der Code kann schnell nach eigenen Bedürfnissen modifiziert werden, nur die Klasse SecureString ist leicht gewöhnungsbedürftig (man kann nur einzelne Chareacter anfügen, keine Strings übergeben).
Imports System.Security


Public Class Form1

Public password As SecureString = New SecureString()

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.txtUser.Text = System.Environment.UserName
    End Sub


    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRun.Click

        StartNewProcessWithAdminCredentials("C:MeineAnwendung", Me.txtUser.Text)

    End Sub

    Private Function StartNewProcessWithAdminCredentials(ByVal ExecutablePathAndName As String, _
                                                         ByVal sUsername As String, _
                                                         Optional ByVal StartArguments As String = "") As System.Diagnostics.Process


        Dim newProcessStartUpInfo As System.Diagnostics.ProcessStartInfo
        Dim ReturnCode As Boolean = False

        Try

            newProcessStartUpInfo = New System.Diagnostics.ProcessStartInfo(ExecutablePathAndName, StartArguments)
            'XP oder hoeher (Vista = 6)
            If System.Environment.OSVersion.Version.Major >= 5 Then
                newProcessStartUpInfo.Verb = "runas"
                newProcessStartUpInfo.UseShellExecute = False
                newProcessStartUpInfo.Password = password
                newProcessStartUpInfo.UserName = sUsername
                Return System.Diagnostics.Process.Start(newProcessStartUpInfo)
            Else

                Return System.Diagnostics.Process.Start(newProcessStartUpInfo)

            End If
        Catch ex As Exception
            MsgBox(ex.Message)
            Return Nothing
        End Try
    End Function



    Private Sub txtPass_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtPass.Enter
        password.Clear()
    End Sub

    Private Sub txtPass_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtPass.KeyPress
        Select Case Asc(e.KeyChar)
            Case 33 To 126
                password.AppendChar(ChrW(Asc(e.KeyChar)))
            Case Else
                e.Handled = True
        End Select
    End Sub

End Class
Imports System.Security


Public Class Form1

Public password As SecureString = New SecureString()

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.txtUser.Text = System.Environment.UserName
    End Sub


    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRun.Click

        StartNewProcessWithAdminCredentials("C:MeineAnwendung", Me.txtUser.Text)

    End Sub

    Private Function StartNewProcessWithAdminCredentials(ByVal ExecutablePathAndName As String, _
                                                         ByVal sUsername As String, _
                                                         Optional ByVal StartArguments As String = "") As System.Diagnostics.Process


        Dim newProcessStartUpInfo As System.Diagnostics.ProcessStartInfo
        Dim ReturnCode As Boolean = False

        Try

            newProcessStartUpInfo = New System.Diagnostics.ProcessStartInfo(ExecutablePathAndName, StartArguments)
            'XP oder hoeher (Vista = 6)
            If System.Environment.OSVersion.Version.Major >= 5 Then
                newProcessStartUpInfo.Verb = "runas"
                newProcessStartUpInfo.UseShellExecute = False
                newProcessStartUpInfo.Password = password
                newProcessStartUpInfo.UserName = sUsername
                Return System.Diagnostics.Process.Start(newProcessStartUpInfo)
            Else

                Return System.Diagnostics.Process.Start(newProcessStartUpInfo)

            End If
        Catch ex As Exception
            MsgBox(ex.Message)
            Return Nothing
        End Try
    End Function



    Private Sub txtPass_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtPass.Enter
        password.Clear()
    End Sub

    Private Sub txtPass_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtPass.KeyPress
        Select Case Asc(e.KeyChar)
            Case 33 To 126
                password.AppendChar(ChrW(Asc(e.KeyChar)))
            Case Else
                e.Handled = True
        End Select
    End Sub

End Class

1 Kommentar

  1. Wenn eine Anwendung immer Administratorrechte braucht, solte man eher ein Anwendungsmanifest verwenden. In diesem kann auch Adminrechte verlangen. (Unter Win7 und 8 schon getestet, XP und Vista kommen damit wahrscheinlich auch zurrecht.)
    Ich würde einer x-beliebigen Anwendung nicht meine Anmeldedaten anvertrauen.

    IMHO ist es so, dass wenn man keine Anmeldedaten angibt, dass der Benutzer dann gefragt wird.