none
Benutzern-Ameldename auslesen

    Frage

  • Hallo,


    ich möchte in einer Access-DB (2010) den Anmeldenamen am Betriebssystem auslesen, welchen der Nutzer der DB nutzt. Als Backend soll eine SQL Server 2008-DB genutzt werden.

    Damit würde die Zweitanmeldung an der DB entfallen und die Formularvarianten und Zugriffsrechte könnten entsprechend gesteuert werden. Die Nutzung der System.mdw erlaubt auch nicht die erforderliche Formular- / Rechtesteuerung

    Vielen Dank im Voraus

    Wolfgang

    Samstag, 16. Oktober 2010 20:56

Antworten

  • Am 16.10.2010 schrieb Wolfgang Woicke:

    ich möchte in einer Access-DB (2010) den Anmeldenamen am Betriebssystem auslesen, welchen der Nutzer der DB nutzt. Als Backend soll eine SQL Server 2008-DB genutzt werden.

    Hinzufügend zu Josefs Lösung:

    Function fOSUserName() As String
    On Error GoTo err_fOSUserName:

         Dim lngLen As Long, lngX As Long
         Dim strUserName As String

         strUserName = String$(254, 0)
         lngLen = 255
         lngX = apiGetUserName(strUserName, lngLen)
         If lngX <> 0 Then
            fOSUserName = Left$(strUserName, lngLen - 1)
           Else
            fOSUserName = ""
         End If

    exit_fOSUserName:
        Exit Function
    err_fOSUserName:
        MsgBox "Fehler: " & Err.Number & " " & Err.Description & " " & mModName & ".fOSUserName() As String"
        fOSUserName = ""
        Resume exit_fOSUserName
    End Function
    Servus
    Winfried


    Connect2WSUS: http://www.grurili.de/tools/Connect2WSUS.exe
    GPO's: http://www.gruppenrichtlinien.de
    Community Forums NNTP Bridge: http://communitybridge.codeplex.com/

    Sonntag, 17. Oktober 2010 09:59
  • Hallo Wolfgang,

    Wolfgang Woicke schrieb folgendes:

    vielen Dank für die Antwort. Die Funktion gefällt mir schon gut, weil sie auch eine Fehlerprüfung enthält.

    Allerdings bringt apiGetUserName bei mir Fehler. Was müsste für die Nutzung eingebunden werden?

    Du benötigst noch die API Deklaration
    Private Declare Function apiGetUserName Lib "advapi32.dll" Alias _
     "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long

    Vollständiger Code unter:
    http://www.mvps.org/access/api/api0008.htm

    Gruß
    Gunter


    Access FAQ: http://www.donkarl.com

          http://www.avenius.de - http://www.AccessRibbon.de
    http://www.ribboncreator.de - http://www.ribboncreator2010.de

    Sonntag, 17. Oktober 2010 12:10
    Moderator
  • Hallo!

    Wolfgang Woicke schrieb:

    ich möchte in einer Access-DB (2010) den Anmeldenamen am Betriebssystem auslesen, welchen der Nutzer der DB nutzt.

    Das wäre mit environ("username") möglich.

    Als Backend soll eine SQL Server 2008-DB genutzt werden.

    Serverseitig könntest du die Windows-Authentifizierung nutzen, dann
    musst du dich in der Access-Anwendung überhaupt nicht um die Anmeldung
    am Server kümmern.

    Damit würde die Zweitanmeldung an der DB entfallen und die 
    Formularvarianten und Zugriffsrechte könnten entsprechend gesteuert werden. Die Nutzung der System.mdw erlaubt auch nicht die erforderliche Formular- / Rechtesteuerung

    Die Rechte für die Formulare könntest du im MSSQL-Server abfragen. Die
    Benutzer werden MSSQL-Rollen zugewiesen und die Rollenzugehörigkeit
    gibt Auskunft über die Rechte.

    mfg
    Josef

    Sonntag, 17. Oktober 2010 08:07
  • Am 17.10.2010 schrieb Wolfgang Woicke:

    vielen Dank für die Antwort. Die Funktion gefällt mir schon gut, weil sie auch eine Fehlerprüfung enthält.

    Die könnte man sich allerdings auch schnell selbst einbauen. ;)

    Allerdings bringt apiGetUserName bei mir Fehler. Was müsste für die Nutzung eingebunden werden?

    Ups, sorry, Gunter hat dir ja schon geholfen. ;)

    Da hätte ich noch etwas für Dich. Falls Du die Möglichkeit hast, die
    Berechtigungen über lokale Gruppen zu steuern, dann kannst Du dir mit
    dieser Funktion weiter helfen:

    Public Function MemberInGroup(strUser As String) As String
    On Error GoTo ErrHandler

    Dim oADSI As Object
    Dim oGroup As Object
    Dim sDomain As String
    Dim oMember As Object

    ' lokaler PC
    sDomain = "."

    ' ADSI Container-Objekt erstellen
    Set oADSI = GetObject("WinNT://" & sDomain)

    ' Benutzergruppen filtern
    oADSI.Filter = Array("Group")

    ' alle Benutzergruppen auflisten
    For Each oGroup In oADSI
        'Debug.Print oGroup.Name
        For Each oMember In oGroup.Members
            If strUser = oMember.Name Then
                If Left(oGroup.Name, 2) = "AD" Then
                    ' Bei der ersten gefundenen Gruppenmitgliedschaft wird die Funktion verlassen!
                    MemberInGroup = oGroup.Name
                    Exit Function
                End If
            End If
        Next
    Next

    exit_MemberInGroup:
        Exit Function
    ErrHandler:
      ' Objekte zerstören
      Set oGroup = Nothing
      Set oADSI = Nothing
    End Function

    Servus
    Winfried


    Connect2WSUS: http://www.grurili.de/tools/Connect2WSUS.exe
    GPO's: http://www.gruppenrichtlinien.de
    Community Forums NNTP Bridge: http://communitybridge.codeplex.com/

    Sonntag, 17. Oktober 2010 13:15
  • Hallo,

    Wolfgang Woicke wrote:

    ich möchte in einer Access-DB (2010) den Anmeldenamen am Betriebssystem
    auslesen, welchen der Nutzer der DB nutzt. Als Backend soll eine SQL
    Server 2008-DB genutzt werden.

    http://www.donkarl.com?FAQ2.24

    Gruss - Peter


    Mitglied im http://www.dbdev.org
    FAQ: http://www.donkarl.com

    Sonntag, 17. Oktober 2010 13:33
    Moderator

Alle Antworten

  • Hallo!

    Wolfgang Woicke schrieb:

    ich möchte in einer Access-DB (2010) den Anmeldenamen am Betriebssystem auslesen, welchen der Nutzer der DB nutzt.

    Das wäre mit environ("username") möglich.

    Als Backend soll eine SQL Server 2008-DB genutzt werden.

    Serverseitig könntest du die Windows-Authentifizierung nutzen, dann
    musst du dich in der Access-Anwendung überhaupt nicht um die Anmeldung
    am Server kümmern.

    Damit würde die Zweitanmeldung an der DB entfallen und die 
    Formularvarianten und Zugriffsrechte könnten entsprechend gesteuert werden. Die Nutzung der System.mdw erlaubt auch nicht die erforderliche Formular- / Rechtesteuerung

    Die Rechte für die Formulare könntest du im MSSQL-Server abfragen. Die
    Benutzer werden MSSQL-Rollen zugewiesen und die Rollenzugehörigkeit
    gibt Auskunft über die Rechte.

    mfg
    Josef

    Sonntag, 17. Oktober 2010 08:07
  • Am 16.10.2010 schrieb Wolfgang Woicke:

    ich möchte in einer Access-DB (2010) den Anmeldenamen am Betriebssystem auslesen, welchen der Nutzer der DB nutzt. Als Backend soll eine SQL Server 2008-DB genutzt werden.

    Hinzufügend zu Josefs Lösung:

    Function fOSUserName() As String
    On Error GoTo err_fOSUserName:

         Dim lngLen As Long, lngX As Long
         Dim strUserName As String

         strUserName = String$(254, 0)
         lngLen = 255
         lngX = apiGetUserName(strUserName, lngLen)
         If lngX <> 0 Then
            fOSUserName = Left$(strUserName, lngLen - 1)
           Else
            fOSUserName = ""
         End If

    exit_fOSUserName:
        Exit Function
    err_fOSUserName:
        MsgBox "Fehler: " & Err.Number & " " & Err.Description & " " & mModName & ".fOSUserName() As String"
        fOSUserName = ""
        Resume exit_fOSUserName
    End Function
    Servus
    Winfried


    Connect2WSUS: http://www.grurili.de/tools/Connect2WSUS.exe
    GPO's: http://www.gruppenrichtlinien.de
    Community Forums NNTP Bridge: http://communitybridge.codeplex.com/

    Sonntag, 17. Oktober 2010 09:59
  • Hallo,

    vielen Dank für die Antwort. Die Funktion gefällt mir schon gut, weil sie auch eine Fehlerprüfung enthält.

    Allerdings bringt apiGetUserName bei mir Fehler. Was müsste für die Nutzung eingebunden werden?

    Mit freundlichen Grüßen

    Wolfgang Woicke

     

    Sonntag, 17. Oktober 2010 12:04
  • Hallo Wolfgang,

    Wolfgang Woicke schrieb folgendes:

    vielen Dank für die Antwort. Die Funktion gefällt mir schon gut, weil sie auch eine Fehlerprüfung enthält.

    Allerdings bringt apiGetUserName bei mir Fehler. Was müsste für die Nutzung eingebunden werden?

    Du benötigst noch die API Deklaration
    Private Declare Function apiGetUserName Lib "advapi32.dll" Alias _
     "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long

    Vollständiger Code unter:
    http://www.mvps.org/access/api/api0008.htm

    Gruß
    Gunter


    Access FAQ: http://www.donkarl.com

          http://www.avenius.de - http://www.AccessRibbon.de
    http://www.ribboncreator.de - http://www.ribboncreator2010.de

    Sonntag, 17. Oktober 2010 12:10
    Moderator
  • Hallo,

    vielen Dank für die Antwort. environ("username") werde ich erst einmal als Lösung nutzen, es funktionierte beim Test ausgezeichnet.

    Innerhalb der Access-Anwendung gibt es eine Tabelle, in welcher die Rechte der User für den ejweiligen Ablauf vermerkt sind. Es kann sein, dass der User beim Wählen Ablauf A andere Formulare sieht und er auch andere Rechte hat, als beim Wählen des Ablaufs B. Näher kann ich den Wirrwarr aus sicher verständlichen Gründen nicht erläutern.

    Mit freundlichen Grüßen

    Wolfgang Woicke

    Sonntag, 17. Oktober 2010 12:11
  • Am 17.10.2010 schrieb Wolfgang Woicke:

    vielen Dank für die Antwort. Die Funktion gefällt mir schon gut, weil sie auch eine Fehlerprüfung enthält.

    Die könnte man sich allerdings auch schnell selbst einbauen. ;)

    Allerdings bringt apiGetUserName bei mir Fehler. Was müsste für die Nutzung eingebunden werden?

    Ups, sorry, Gunter hat dir ja schon geholfen. ;)

    Da hätte ich noch etwas für Dich. Falls Du die Möglichkeit hast, die
    Berechtigungen über lokale Gruppen zu steuern, dann kannst Du dir mit
    dieser Funktion weiter helfen:

    Public Function MemberInGroup(strUser As String) As String
    On Error GoTo ErrHandler

    Dim oADSI As Object
    Dim oGroup As Object
    Dim sDomain As String
    Dim oMember As Object

    ' lokaler PC
    sDomain = "."

    ' ADSI Container-Objekt erstellen
    Set oADSI = GetObject("WinNT://" & sDomain)

    ' Benutzergruppen filtern
    oADSI.Filter = Array("Group")

    ' alle Benutzergruppen auflisten
    For Each oGroup In oADSI
        'Debug.Print oGroup.Name
        For Each oMember In oGroup.Members
            If strUser = oMember.Name Then
                If Left(oGroup.Name, 2) = "AD" Then
                    ' Bei der ersten gefundenen Gruppenmitgliedschaft wird die Funktion verlassen!
                    MemberInGroup = oGroup.Name
                    Exit Function
                End If
            End If
        Next
    Next

    exit_MemberInGroup:
        Exit Function
    ErrHandler:
      ' Objekte zerstören
      Set oGroup = Nothing
      Set oADSI = Nothing
    End Function

    Servus
    Winfried


    Connect2WSUS: http://www.grurili.de/tools/Connect2WSUS.exe
    GPO's: http://www.gruppenrichtlinien.de
    Community Forums NNTP Bridge: http://communitybridge.codeplex.com/

    Sonntag, 17. Oktober 2010 13:15
  • Hallo,

    Wolfgang Woicke wrote:

    ich möchte in einer Access-DB (2010) den Anmeldenamen am Betriebssystem
    auslesen, welchen der Nutzer der DB nutzt. Als Backend soll eine SQL
    Server 2008-DB genutzt werden.

    http://www.donkarl.com?FAQ2.24

    Gruss - Peter


    Mitglied im http://www.dbdev.org
    FAQ: http://www.donkarl.com

    Sonntag, 17. Oktober 2010 13:33
    Moderator
  • Hallo,

    wie konnte ich nur donkarl vergessen:-(

    Mit freundlichen Grüßen

    Wolfgang Woicke

    Dienstag, 26. Oktober 2010 11:14
  • Hallo,

    vielen Dank für die Funktion. Irgendwann werde ich sie brauchen.

    Derzeit ging es wirklich nur um das Auslesen des Anmeldenamens, um damit dem angemeldeten bestimmte Tätigkeiten zuweisen zu können. Es hat hier nicht mit Zugriffsberechtigungen zu tun.

    Mit freundlichen Grüßen

    Wolfgang Woicke

    Dienstag, 26. Oktober 2010 11:18