Prüfen, ob aktueller Benutzer Adminrechte hat

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 32 Antworten in diesem Thema. Der letzte Beitrag () ist von Dideldum.

    Prüfen, ob aktueller Benutzer Adminrechte hat

    Hallo.

    Es gab dazu bereits schon einmal einen Thread (Prüfen ob User Adminrechte besitzt - SuFu und Google genutzt)
    mit dem gleichen Problem. (Der Thread ist jedoch schon älter, demnach habe ich einen Neuen erstellt)

    Ich würde gerne prüfen, ob der aktuelle Benutzer Adminrechte besitzt oder nicht.

    Folgenden Code habe ich:

    VB.NET-Quellcode

    1. Private Sub aa()
    2. Dim wp = New WindowsPrincipal(WindowsIdentity.GetCurrent())
    3. If wp.IsInRole(WindowsBuiltInRole.Administrator) Then
    4. MessageBox.Show("Admin!")
    5. Else
    6. MessageBox.Show("Anderer Benutzer!")
    7. End If
    8. End Sub


    Leider gibt der mir zurück "anderer Benutzer"
    obwohl ich Administrator bin.

    OS ist Win 8.1 , 64 Bit.

    Hat jemand eine Lösung?

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Daniel Baumert“ ()

    Cool!
    Eventuell noch die Funktion umbenennen, dann passt es ja, oder?

    Edit: Aha, warum nicht gleich den Fehler angegeben?
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Trade“ ()

    ErfinderDesRades schrieb:


    vermute ich nächstliegenderweise, dass bei dir das Proggi eben nicht unter einem Admin-Account läuft.


    Haha, warum bist Du mir gegenüber immer so misstrauisch ? :)
    Warum sollte ich lügen? ich möchte doch das Problem gelöst bekommen,
    da wäre es eher ungünstig hier rumzulügen :D
    Bilder
    • Hier.PNG

      35,21 kB, 1.078×543, 300 mal angesehen

    Dksksm schrieb:

    Hast Du VS denn wirklich als Admin gestartet? Bei mir geht's nämlich einwandfrei.

    OS: Windows 8.1 64-bit

    Es geht ja nicht darum, die Anwendung als Admin gestartet zu haben, sondern
    ob der aktuelle Account über Adminrechte verfügt , nicht dass das Programm Adminrechte hat.

    @ EFD, welche Property muss ich nachsehen?

    Da sind soviele Sub properties - ich hab da nirgendswo Eazy gefunden jetzt (auf den ersten Blick).
    Ah, found.

    Da steht "Eazy" , also Ja :)
    Ist der Adminaccount.

    Wie gesagt: Es geht nicht darum zu prüfen, ob die Anwendung Adminrechte hat.

    Es geht darum zu prüfen, ob der aktuelle Account über Adminrechte verfügt.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Daniel Baumert“ ()

    Was Du prüfen willst, geht so anscheinend nicht, deshalb ja auch meine Frage.
    Auch bei mir ist das Ergebnis "Anwender", wenn ich das Programm nicht explizit mit Adminrechten starte.
    Ich denke, dass es an der Benutzerkontensteuerung liegt. Schliesslich soll man ja explizit Adminrechte anfordern, wenn ein Programm sie benötigt.
    Hätte da ein Workaround. Die Kommandozeile kann dir behilflich sein.

    VB.NET-Quellcode

    1. Private Function HaveAdminPermissions() As Boolean
    2. Dim res As String = String.Empty
    3. Using p As New Process()
    4. Dim pi As New ProcessStartInfo
    5. With pi
    6. .FileName = "cmd"
    7. .RedirectStandardInput = True
    8. .RedirectStandardOutput = True
    9. .CreateNoWindow = True
    10. .UseShellExecute = False
    11. End With
    12. p.StartInfo = pi
    13. p.Start()
    14. Using sr As IO.StreamReader = p.StandardOutput
    15. Using sw As IO.StreamWriter = p.StandardInput
    16. sw.WriteLine("net user " & Environment.UserName)
    17. sw.WriteLine("exit")
    18. res = sr.ReadToEnd
    19. End Using
    20. End Using
    21. End Using
    22. Dim reg As New System.Text.RegularExpressions.Regex("(?<=[*])(.*?)(?=\n)")
    23. Dim mc As System.Text.RegularExpressions.MatchCollection = reg.Matches(res)
    24. For Each m As System.Text.RegularExpressions.Match In mc
    25. If m.ToString.ToLower.Contains("administrator") Then
    26. Return True
    27. End If
    28. Next
    29. Return False
    30. End Function
    Ok, habe nun den Code von Murdock genommen (allerdings bisschen anders):

    VB.NET-Quellcode

    1. Private Function AdminPermissions() As Boolean
    2. Using p As New Process()
    3. p.StartInfo = New ProcessStartInfo With {
    4. .FileName = "cmd",
    5. .RedirectStandardInput = True,
    6. .RedirectStandardOutput = True,
    7. .CreateNoWindow = True,
    8. .UseShellExecute = False}
    9. p.Start()
    10. p.StandardInput.WriteLine("net user " & Environment.UserName)
    11. p.StandardInput.WriteLine("exit")
    12. Do
    13. Dim line = p.StandardOutput.ReadLine
    14. If line Is Nothing Then Return False
    15. If line.ToLower.Contains("administrator") Then Return True
    16. Loop
    17. End Using
    18. End Function


    Edit: An ErfinderdesRades Code angepasst (bei dir fehlt .Tolower!) :)

    Danke dafür!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Daniel Baumert“ ()

    geht einfacher ohne Regex

    VB.NET-Quellcode

    1. Private Function AdminPermissions() As Boolean
    2. Using p As New Process()
    3. p.StartInfo = New ProcessStartInfo With {
    4. .FileName = "cmd",
    5. .RedirectStandardInput = True,
    6. .RedirectStandardOutput = True,
    7. .CreateNoWindow = True,
    8. .UseShellExecute = False}
    9. p.Start()
    10. p.StandardInput.WriteLine("net user " & Environment.UserName)
    11. p.StandardInput.WriteLine("exit")
    12. Do
    13. Dim line = p.StandardOutput.ReadLine
    14. If line Is Nothing Then Return False
    15. If line.Contains("administrator") Then Return True
    16. Loop
    17. End Using
    18. End Function

    Oder über die API
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Enum TOKEN_ELEVATION_TYPE
    2. TokenElevationTypeDefault = 1
    3. TokenElevationTypeFull
    4. TokenElevationTypeLimited
    5. End Enum
    6. Private Enum TOKEN_INFO_CLASS
    7. TokenUser = 1
    8. TokenGroups
    9. TokenPrivileges
    10. TokenOwner
    11. TokenPrimaryGroup
    12. TokenDefaultDacl
    13. TokenSource
    14. TokenType
    15. TokenImpersonationLevel
    16. TokenStatistics
    17. TokenRestrictedSids
    18. TokenSessionId
    19. TokenGroupsAndPrivileges
    20. TokenSessionReference
    21. TokenSandBoxInert
    22. TokenAuditPolicy
    23. TokenOrigin
    24. TokenElevationType
    25. TokenLinkedToken
    26. TokenElevation
    27. TokenHasRestrictions
    28. TokenAccessInformation
    29. TokenVirtualizationAllowed
    30. TokenVirtualizationEnabled
    31. TokenIntegrityLevel
    32. TokenUIAccess
    33. TokenMandatoryPolicy
    34. TokenLogonSid
    35. MaxTokenInfoClass 'MaxTokenInfoClass should always be the last enum
    36. End Enum
    37. <DllImport("kernel32.dll")> Private Shared Function GetCurrentProcess() As IntPtr
    38. End Function
    39. <DllImport("advapi32.dll", SetLastError:=True)> Private Shared Function OpenProcessToken(ByVal ProcessHandle As IntPtr, ByVal DesiredAccess As UInt32, ByRef TokenHandle As IntPtr) As Boolean
    40. End Function
    41. <DllImport("advapi32.dll", SetLastError:=True)> Private Shared Function GetTokenInformation(ByVal TokenHandle As IntPtr, ByVal TokenInformationClass As TOKEN_INFO_CLASS, ByVal TokenInformation As IntPtr, ByVal TokenInformationLength As Integer, ByRef ReturnLength As UInteger) As Boolean
    42. End Function
    43. ''' <summary>
    44. ''' Returns True, when the current user has Admin Rights or can Elevate to Admin Rights
    45. ''' </summary>
    46. ''' <returns></returns>
    47. ''' <remarks></remarks>
    48. Public Function CanElevateToAdmin() As Boolean
    49. If My.User.IsInRole(ApplicationServices.BuiltInRole.Administrator) Then Return True
    50. 'Prior to vista check only Role, because there is no UAC!
    51. If Environment.OSVersion.Version.Major <= 5 Then Return False
    52. Try
    53. Dim myToken As IntPtr
    54. Dim elevationType As TOKEN_ELEVATION_TYPE
    55. Dim dwSize As UInteger
    56. Dim pElevationType As IntPtr = Marshal.AllocHGlobal(4)
    57. 'GET A TOKEN REFERENCE FOR THE USER RUNNING THIS PROCESS
    58. OpenProcessToken(GetCurrentProcess(), &H8, myToken)
    59. 'GET THE ELEVATION INFORMATION FOR THIS TOKEN
    60. GetTokenInformation(myToken, TOKEN_INFO_CLASS.TokenElevationType, pElevationType, 4, dwSize)
    61. 'CAST THE RESULT TO ENUM TYPE
    62. elevationType = DirectCast(Marshal.ReadInt32(pElevationType), TOKEN_ELEVATION_TYPE)
    63. 'FREE ALLOCATED UNMANAGED MEMORY
    64. Marshal.FreeHGlobal(pElevationType)
    65. 'DETERMINE THE RESULT OF THE ELEVATION CHECK
    66. '==============================================
    67. 'TokenElevationTypeFull - User has a split token, and the process is running elevated
    68. 'TokenElevationTypeLimited - User has a split token, but the process is not running elevated
    69. 'TokenElevationTypeDefault - User is not using a split token
    70. '==============================================
    71. Return (elevationType = TOKEN_ELEVATION_TYPE.TokenElevationTypeLimited) OrElse (elevationType = TOKEN_ELEVATION_TYPE.TokenElevationTypeFull)
    72. Catch ex As Exception
    73. Return False
    74. End Try
    75. End Function

    Quelle: zerosandtheone.com/blogs/vb/ar…-vista-and-windows-7.aspx




    Gruss Veronesi

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Veronesi“ ()

    Danke Dir @ErfinderDesRades

    Das ist die einzige wirklich funktionierende Erkennung der Berechtigungen des aktuellen Kontos, die ich finden konnte.

    Allerdings funktioniert diese nur so fehlerfrei:

    VB.NET-Quellcode

    1. Public Function CheckAdministrator() As Boolean
    2. Using p As New Process()
    3. p.StartInfo = New ProcessStartInfo With {
    4. .FileName = "cmd",
    5. .RedirectStandardInput = True,
    6. .RedirectStandardOutput = True,
    7. .CreateNoWindow = True,
    8. .UseShellExecute = False}
    9. p.Start()
    10. p.StandardInput.WriteLine("net user " & Chr(34) & Environment.UserName & Chr(34))
    11. p.StandardInput.WriteLine("exit")
    12. Do
    13. Dim line = p.StandardOutput.ReadLine
    14. If line Is Nothing Then Return False
    15. If line.ToLower.Contains("administrator") Then
    16. Return True
    17. End If
    18. Loop
    19. End Using
    20. Return False
    21. End Function


    Denn einer meiner Kunden hat ein Leerzeichen im Benutzernamen.
    Und da habe ich echt gebraucht, um den Fehler (die fehlenden chr(34) zur String-Kapselung zu finden.
    Daher war er in Deiner Funktion als Admin dennoch nur zum Benutzer degradiert. :D

    Aber jetzt funzt die Funktion perfekt.