Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1136to1140
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
User Namen ermitteln
walter
Ich möchte den User Namen ermitteln, um diesen automatisch in eine Zelle zu schreiben.
Über eine API Funktion lässt sich sehr einfach der Anmeldename, jedoch nicht der reale Name ermitteln.
Über die Funktion Application.userName lässt sich nur der in Office hinterlegte Benutzername ermitteln und dieser ist bei 95% der User nicht gepflegt.
Nun wie kann ich diesen Namen direkt ermitteln?
Eine Idee wäre mit Hilfe des Anmeldenamens im ADS nach dem Namen suchen zu lassen, z.B. mittels LDAP, aber hier komme ich nicht weiter.
Vielleicht hat jm. von Euch eine Idee.
Vielen Dank schon mal
Freundliche Grüße aus dem verschneiten Frankfurt
Walter
AW: User Namen ermitteln
11.02.2010 12:40:25
Hajo_Zi
Hallo Walter,
meinst Du Environ("Username")

AW: User Namen ermitteln
11.02.2010 12:42:00
walter
Hallo Hajo,
die würde auch nur den Windows Anmeldenamen zurückgeben
AW: User Namen ermitteln
11.02.2010 12:44:15
Hajo_Zi
Hallo Walter,
ich vermute an mehr komst Du auch nicht ran. Der Klarname steht in einer Datei auf dem Server. Die Daten sind aber geschützt, sonst könnte jemand ja auch das Passwort auslesen.
Gruß Hajo
AW: User Namen ermitteln
11.02.2010 12:48:54
walter
dem ist nicht so.
wie ich bereits geschrieben habe lässt sich das mit LDAP bewerkstelligen.
Ich habe auch schon erfolgreich mit LDAP gearbeitet und z.B. Gruppen und UserID's ausgelesen. Ich bin aber nicht in der Lage den Namen des Users zu ermitteln, dafür habe ich zu wenig LDAP Kenntnisse - zumindest hoffe ich hier schneller zu einer Lösung zu gelangen
Anzeige
AW: User Namen ermitteln
11.02.2010 12:46:13
walter
vielen Dank Reinhard ,
jedoch sind dies alles Namen die der "Gnade" des users unterliegen (bis auf Environ("Username") ),d.h. der User muss diese Namen selbst einpflegen - darauf kann ich mich hier nicht verlassen.
AW: User Namen ermitteln
11.02.2010 12:48:03
Hajo_Zi
Hallo Walter,
Environ Username kann nicht der User einpflegen. Es sei den er ist der Admin des Netzwerkes.
Gruß Hajo
Anzeige
Es könnt alles so einfach sein ...
11.02.2010 13:19:51
walter
... isses aber nicht:


Sub UserNamen_Ermitteln()
Dim objUser
Set objUser = GetObject("LDAP://" & SRV_NAME & "/" & SearchDistinguishedName(""))
Debug.Print objUser.Get("DisplayName")
End Sub
'If you have just an accountname and want to have the complete distiguished name:
Public Function SearchDistinguishedName(ByVal vSAN)
' Function: SearchDistinguishedName
' Description: Searches the DistinguishedName for a given SamAccountName
' Parameters: ByVal vSAN - The SamAccountName to search
' Returns: The DistinguishedName Name
Dim oRootDSE, oConnection, oCommand, oRecordSet
Set oRootDSE = GetObject("LDAP://rootDSE")
Set oConnection = CreateObject("ADODB.Connection")
oConnection.Open "Provider=ADsDSOObject;"
Set oCommand = CreateObject("ADODB.Command")
oCommand.ActiveConnection = oConnection
oCommand.CommandText = " ">;(&(objectCategory=User)(samAccountName=" & vSAN & "));distinguishedName;subtree"
Set oRecordSet = oCommand.Execute
On Error Resume Next
SearchDistinguishedName = oRecordSet.Fields("DistinguishedName")
On Error GoTo 0
oConnection.Close
Set oRecordSet = Nothing
Set oCommand = Nothing
Set oConnection = Nothing
Set oRootDSE = Nothing
End Function

FUNZT !!!
Möge diese Lösung auch anderen Programmierern nützlich sein :-)
Anzeige
Bitte Zeile oCommand.CommandText = nochmal posten
11.02.2010 16:18:18
NoNet
Hallo Walter,
schön, dass es bei Dir funktioniert !
Da auch ich gelegentlich mit LDAP zu tun habe, interessiert mich diese Möglichkeit natürlich auch brennend :-D
In Deinem geposteten Code ist noch irgendwo ein Fehler :
Die Zeile oCommand.CommandText = " und die Folgezeile gehören offensichtlich irgendwie zusammen, wurde hier aber falsch umgebrochen !?!?
Kannst Du diese Zeile bitte nochmal posten und in <PRE> </PRE> Tags einklammern (siehe Zitat <pre> oberhalb des Beitragsfensters !!)
Vielen Dank, Gruß NoNet
PS: Damit könnte ich die 4 "Usernamen" des von Reinhard geposteten Spotlight-Beitrags dann zumindest auf 5 erhöhen ;-)
Anzeige
AW: Bitte Zeile oCommand.CommandText = nochmal posten
11.02.2010 16:27:25
walter
Du hast Recht, NoNet.
Leider nimmt er mir nicht mehr den ganzen Text auch nicht mit Zitatfunktion, daher hier gleich mal der Link
wo ich die Function her hab:
http://www.tek-tips.com/faqs.cfm?fid=5688
Lass mich wissen ob es bei Dir funktioniert - man lernt ja nie aus!
Gruß Walter
OK, Danke ! - Beispiel funktioniert !
11.02.2010 17:32:26
NoNet
Hallo Walter,
danke für diesen Link ! - Das (erste) Beispiel läuft bei mir einwandfrei.
Ich habe es noch ein wenig ergänzt, so dass man nun auch Joker "(? / *)" in den gesuchten Namen einbauen kann und diese FUNCTION Alle gefundenen Namen in einem String ausgibt :
'Aufruf : Msgbox SearchDistinguishedName("LDAP-NAME*")
'If you have just an accountname and want to have the complete distiguished name:
Public Function SearchDistinguishedName(ByVal vSAN)
' Function:     SearchDistinguishedName
' Description:  Searches the DistinguishedName for a given SamAccountName
' Parameters:   ByVal vSAN - The SamAccountName to search
' Returns:      The DistinguishedName Name
Dim oRootDSE, oConnection, oCommand, oRecordSet, intN, strTemp
Set oRootDSE = GetObject("LDAP://rootDSE")
Set oConnection = CreateObject("ADODB.Connection")
oConnection.Open "Provider=ADsDSOObject;"
Set oCommand = CreateObject("ADODB.Command")
oCommand.ActiveConnection = oConnection
oCommand.CommandText = "<LDAP://" & oRootDSE.Get("defaultNamingContext") & _
">;(&(objectCategory=User)(samAccountName=" & vSAN & "));distinguishedName;subtree"
Set oRecordSet = oCommand.Execute
On Error Resume Next
'List all matching recordsets in one string :
oRecordSet.movefirst
strTemp = oRecordSet.Fields("DistinguishedName") & vbLf
For intN = 1 To oRecordSet.RecordCount - 1
oRecordSet.movenext
strTemp = strTemp & oRecordSet.Fields("DistinguishedName") & vbLf
Next
'only return FIRST matching record :
'SearchDistinguishedName = oRecordSet.Fields("DistinguishedName")
SearchDistinguishedName = strTemp
On Error GoTo 0
oConnection.Close
Set oRecordSet = Nothing
Set oCommand = Nothing
Set oConnection = Nothing
Set oRootDSE = Nothing
End Function
Gruß, NoNet
Anzeige
AW: Bitte Zeile oCommand.CommandText = nochmal posten
11.02.2010 17:32:59
bst
Auch Hallo,
hier funktioniert das nicht?
Set oRootDSE = GetObject("LDAP://rootDSE")
?err.Number
-2147023541
?err.Description
Automatisierungsfehler
Die angegebene Domäne ist nicht vorhanden oder es konnte keine Verbindung hergestellt werden.
Im Gegesatz dazu funktioniert WinAPI - zuerst GetUserName und damit NetUserGetInfo schon.
Dito WMI. ?
cu, Bernd
--
Option Explicit

Const NERR_Success = 0
Const CP_ACP = 0

Private Type USER_INFO_10
    usri10_name As Long
    usri10_comment As Long
    usri10_usr_comment As Long
    usri10_full_name As Long
End Type

' Benutzernamen ermitteln:
Private Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" ( _
    ByVal lpBuffer As String, ByRef Size As Long) As Long

' Benutzerinformationen ermitteln:
Private Declare Function NetUserGetInfo Lib "netapi32" ( _
    ByVal ServerName As Long, ByVal Username As Long, ByVal Level As Long, ByRef ptrBuffer As Long) As Long

' Freigabe des von NetUserGetInfo reservierten Speichers:
Private Declare Function NetApiBufferFree Lib "NETAPI32.DLL" (ByVal ptrBuffer As Long) As Long

' Speicherbereiche kopieren:
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
    ByRef Destination As Any, ByRef Source As Any, ByVal Size As Long)

' Stringlänge ermitteln
Private Declare Function lstrlenW Lib "kernel32" (lpString As Any) As Long

' Zeichenkonvertierung
Private Declare Function WideCharToMultiByte Lib "kernel32" ( _
    ByVal codepage As Long, ByVal dwFlags As Long, lpWideCharStr As Any, ByVal cchWideChar As Long, _
    lpMultiByteStr As Any, ByVal cchMultiByte As Long, ByVal lpDefaultChar As String, _
    ByVal lpUsedDefaultChar As Long) As Long

' Returns the string before first null char encountered (if any) from an ANSII string.
Public Function GetStrFromBufferA(sz As String) As String
    If InStr(sz, vbNullChar) Then
        GetStrFromBufferA = Left$(sz, InStr(sz, vbNullChar) - 1)
    Else
        ' If sz had no null char, the Left$ function
        ' above would return a zero length string ("").
        GetStrFromBufferA = sz
    End If
End Function

' Returns an ANSI string from a pointer to a Unicode string.
Public Function GetStrFromPtrW(lpszW As Long) As String
    Dim sRtn As String
    sRtn = String$(lstrlenW(ByVal lpszW) * 2, 0) ' 2 bytes/char
    ' WideCharToMultiByte also returns Unicode string length
    Call WideCharToMultiByte(CP_ACP, 0, ByVal lpszW, -1, ByVal sRtn, Len(sRtn), 0, 0)
    GetStrFromPtrW = GetStrFromBufferA(sRtn)
End Function

Sub GetFullName()
    Dim lpBuf As Long
    Dim ui10 As USER_INFO_10
    Dim strUserName As String
    Dim lngErr As Long
    
    'Create a buffer
    strUserName = String(100, Chr$(0))
    'Get the username
    GetUserName strUserName, 100
    'strip the rest of the buffer
    strUserName = GetStrFromBufferA(strUserName)
    
    lngErr = NetUserGetInfo(0, StrPtr(strUserName), 10, lpBuf)
    If lngErr = NERR_Success Then
        Call CopyMemory(ui10, ByVal lpBuf, Len(ui10))
        MsgBox GetStrFromPtrW(ui10.usri10_full_name), , strUserName
        Call NetApiBufferFree(ByVal lpBuf)
    Else
        MsgBox "Fehler: " & lngErr
    End If
End Sub



sowie:
Option Explicit

Function GetFullName()
    Dim WshNetWork As Object, objUser As Object
    
    On Error Resume Next
    Set WshNetWork = CreateObject("WScript.Network")
    If Not WshNetWork Is Nothing Then
        Set objUser = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & _
            WshNetWork.ComputerName & "\root\cimv2:Win32_UserAccount." & _
            "Domain='" & WshNetWork.UserDomain & _
            "',Name='" & WshNetWork.Username & "'")
        If Not objUser Is Nothing Then
            GetFullName = objUser.FullName
            Set objUser = Nothing
        End If
        Set WshNetWork = Nothing
    End If
End Function

Sub xx()
    MsgBox GetFullName
End Sub


Anzeige
AW: Bitte Zeile oCommand.CommandText = nochmal posten
12.02.2010 09:34:52
walter
wow, Klasse Antwort. Hätte ich hier ehrlich gesagt nicht erwartet.
Zu Deinem Fehler, Bernd kann ich nur vermuten das der Server Name nicht stimmt. Ansonsten sucht sich die Function alles selber.
Das WMI-Script funktioniert bei mir einwandfrei
während API den Fehler 2221 zurückgibt. Vielleicht hast Du, Bernd dazu eine Idee
Vielleicht können auch die anderen die Funktionen testen und wir sehen dann welche Variante die zuverlässigste ist, bzw. am meisten "Plattform-unabhängig"
Also, es bleibt Spannend ! :-)
Gruß Walter
AW: Bitte Zeile oCommand.CommandText = nochmal posten
bst
Morgen Walter,
Zu Deinem Fehler, Bernd kann ich nur vermuten das der Server Name nicht stimmt.
Hmm, der spielt doch an dieser Stelle noch gar keine Rolle?
Aber, Silly Me, ich hatte ganz vergessen dass ich mich da wohl als lokaler Admin angemeldet hatte und auf die Domäne nur zugreife, mich aber dort nicht explizit ein-geloggt hatte :-(
Ich kann das aber erst am Montag testen, habe Heute frei :-)
Warum API bei Dir nicht funktioniert ? Googeln nach "error 2221" liefert denn u.a.
"Der Benutzername konnte nicht gefunden werden. "
Schau mal nach ob der so passt.
Außerdem gibt es denn da mehrere Varianten der USER_INFO_x Struktur, so etwa 9 verschiedene Teile...
siehe z.B.: http://msdn.microsoft.com/en-us/library/aa370654(VS.85).aspx
Wäre ja denkbar dass man da eine andere Variante braucht, möglicherweise habe ich ja damit auch die lokalen Einstellungen des Admin gelesen, nicht die der Domäne.
Auch das kann ich mir frühestens am Montag anschauen.
Schönes Wochenende,
Bernd
Anzeige
AW: Bitte Zeile oCommand.CommandText = nochmal posten
12.02.2010 10:34:53
walter
Guten Morgen Bernd,
beim Aufruf brauchst Du den SrvNamen (hier als Konstante "SRV_NAME "):
Function UserNamen_Ermitteln() As String
On Error GoTo Fehler
Dim objUser
Set objUser = GetObject("LDAP://" &  SRV_NAME  & "/" & SearchDistinguishedName( _
CurrentUserID))
UserNamen_Ermitteln = objUser.Get("DisplayName")
Exit Function
Fehler:
'Der Fehler "Automatisierungsfehler" taucht dann auf, wenn die UserID nicht gefunden wird
If Err.Description = "Automatisierungsfehler" Then
UserNamen_Ermitteln = CurrentUserID
Else
MsgBox Err.Description
End If
End Function
Die API muss ich noch testen, hab aber im Moment keine Zeit dazu.
Ich wünsche Dir auch noch ein schönes verlängertes WE
Gruß Walter
Anzeige
AW: Bitte Zeile oCommand.CommandText = nochmal posten
bst
Hi Walter,
das ist mir schon klar.
Aber, wenn ich das im Einzelschrittmodus durchlaufe bekomme ich bereits an der Stelle:
Set oRootDSE = GetObject("LDAP://rootDSE")
einen Laufzeitfehler. Und hier spielt M.E. der Name noch überhaupt keine Rolle.
lg, Bernd
Es bleibt spannend ...
12.02.2010 11:07:27
walter
Dann warten wir mal ab bis Montag, vielleicht lag es doch an der Anmeldung
Gruß Walter
AW: Es bleibt spannend ...
15.02.2010 09:38:40
bst
Morgen Walter,
wenn ich mich in der Domände anmelde funktionieren hier alle drei Varianten.
Ich brauche allerdings für LDAP einen Aufruf der Art:
strName = "LDAP://" & SRV_NAME & "/" & SearchDistinguishedName(USER_NAME)
Wenn ich USER_NAME leer lasse bekomme ich einen Automatisierungsfehler 80005000.
cu, Bernd
Anzeige
AW: Es bleibt spannend ...
15.02.2010 09:55:06
bst
Nachtrag,
hier funktioniert übrigens aus so etwas.
cu, Bernd
--
Option Explicit
Sub FullUserName()
Dim objSysInfo As Object, objUser As Object
Set objSysInfo = CreateObject("ADSystemInfo")
Set objUser = GetObject("LDAP://" & objSysInfo.UserName)
Debug.Print objUser.FullName
End Sub

299 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige