Dienst unter lokalem Konto und angemeldeten Windows-User auslesen

  • VB.NET

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von schlangafänga.

    Dienst unter lokalem Konto und angemeldeten Windows-User auslesen

    Hallo zusammen,

    ich habe unter vb.net 2010 einen Dienst geschrieben. Dieser soll unter dem lokalen Systemkonto laufen.
    Vom Dienst wird eine Konfig-Datei gelesen, die für diverse User Parameter enthält.

    Um zu ermitteln, welcher User angemeldet ist, wollte ich mir den Windows-User auslesen. Das Ergebnis ist aber immer der User
    "SYSTEM", da der Dienst ja eben unter dem lokalen Systemkonto läuft.
    Besteht hier irgendwie die Möglichkeit auszulesen, welcher User "wirklich" am Rechner angemeldet ist?
    Den Dienst würde ich nur ungern unter einen separaten Benutzer starten.

    Das Auslesen des angemeldeten Benutzers habe ich folgendermaßen versucht.

    Danke schonmal für eure Tipps!

    1. Option

    VB.NET-Quellcode

    1. user = Environment.UserName


    2. Option
    Eigene Funktion, die mir den User zurückgibt

    VB.NET-Quellcode

    1. Public Shared Function get_win_user() As String
    2. Dim oUser As New WindowsPrincipal(WindowsIdentity.GetCurrent)
    3. With oUser.Identity.Name()
    4. Return (.Substring(.IndexOf("\") + 1))
    5. End With
    6. End Function
    Hi

    schau mal hier

    Da hatte jemand das gleiche Problem.
    Alternativ könnte WMI helfen. Allerdings wird es bei WMI schwer mit mehreren gleichzeitig angemeldeten Benutzern.
    Wenn es wirklich ein Einzelarbeitsplatz ist, dürfte es mit WMI leichter gehen.

    Gruß Mono
    Das ist meine Signatur und sie wird wunderbar sein!
    Hi,

    danke für deinen Tipp Mono.

    WMI kam leider nicht in Frage. Kannte ich vorher aber noch nicht, also immerhin was dazu gelernt :)
    Habe die Idee aus deinem Link aufgegriffen abzuprüfen, unter welchem User der explorer-Prozess läuft.
    Habe das Ganze aber etwas anders umgesetzt.

    Hier mal mein Code. Evtl. hilfts ja noch jemandem.

    Gruß

    VB.NET-Quellcode

    1. Imports System.Collections.Generic
    2. Imports System.Text
    3. Imports System.Runtime.InteropServices
    4. Imports System.Diagnostics
    5. Imports System.Security.Principal
    6. Module m_get_win_user
    7. <DllImport("advapi32.dll", SetLastError:=True)> _
    8. Private Function OpenProcessToken(ByVal ProcessHandle As IntPtr, ByVal DesiredAccess As UInt32, ByRef TokenHandle As IntPtr) As Boolean
    9. End Function
    10. <DllImport("kernel32.dll", SetLastError:=True)> _
    11. Private Function CloseHandle(ByVal hObject As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
    12. End Function
    13. Const TOKEN_QUERY As UInteger = &H8
    14. Public Function get_explorer_user() As String
    15. 'Durchlaufen aller aktiven Prozesse
    16. For Each p As Process In Process.GetProcesses()
    17. If p.ProcessName = "explorer" Then
    18. Dim ph As IntPtr = IntPtr.Zero
    19. Try
    20. OpenProcessToken(p.Handle, TOKEN_QUERY, ph)
    21. Dim wi As New WindowsIdentity(ph)
    22. 'Rückgabe angemeldeten Windows-User
    23. Return wi.Name
    24. Catch xcp As Exception
    25. Finally
    26. If ph <> IntPtr.Zero Then
    27. CloseHandle(ph)
    28. End If
    29. End Try
    30. End If
    31. Next
    32. 'Prozess nicht gefunden
    33. Return "PROCESS_NOT_FOUND"
    34. End Function
    35. End Module