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
1 Kommentare zum Snippet