2017-01-04 7 views
1

Ich verwende den folgenden Code, um den Vor- und Nachnamen eines Windows-Benutzers zu erhalten.VBA erhalten Windows Vor- und Nachname des Benutzers

Der Benutzername ist in Zelle A2 wie:

SmithD

Der Code funktioniert, aber es setzt den Nachnamen durch ein Komma getrennt des Benutzers und dann ihren Vornamen. Dh:

Smith, Dave

Ich möchte diese aussehen ändern:

Dave.Smith und fügen Sie dann @ inbox.com

So:

Dave.Smith @ inbox.com

Sub Test() 
    strUser = Range("A2").Value 
    struserdn = Get_LDAP_User_Properties("user", "samAccountName", strUser, "displayName") 
    If Len(struserdn) <> 0 Then 
     MsgBox struserdn 
    Else 
     MsgBox "No record of " & strUser 
    End If 
End Sub 

Function Get_LDAP_User_Properties(strObjectType, strSearchField, strObjectToGet, strCommaDelimProps) 

' This is a custom function that connects to the Active Directory, and returns the specific 
' Active Directory attribute value, of a specific Object. 
' strObjectType: usually "User" or "Computer" 
' strSearchField: the field by which to seach the AD by. This acts like an SQL Query's WHERE clause. 
'    It filters the results by the value of strObjectToGet 
' strObjectToGet: the value by which the results are filtered by, according the strSearchField. 
'    For example, if you are searching based on the user account name, strSearchField 
'    would be "samAccountName", and strObjectToGet would be that speicific account name, 
'    such as "jsmith". This equates to "WHERE 'samAccountName' = 'jsmith'" 
' strCommaDelimProps: the field from the object to actually return. For example, if you wanted 
'    the home folder path, as defined by the AD, for a specific user, this would be 
'    "homeDirectory". If you want to return the ADsPath so that you can bind to that 
'    user and get your own parameters from them, then use "ADsPath" as a return string, 
'    then bind to the user: Set objUser = GetObject("LDAP://" & strReturnADsPath) 

' Now we're checking if the user account passed may have a domain already specified, 
' in which case we connect to that domain in AD, instead of the default one. 
    If InStr(strObjectToGet, "\") > 0 Then 
     arrGroupBits = Split(strObjectToGet, "\") 
     strDC = arrGroupBits(0) 
     strDNSDomain = strDC & "/" & "DC=" & Replace(Mid(strDC, InStr(strDC, ".") + 1), ".", ",DC=") 
     strObjectToGet = arrGroupBits(1) 
    Else 
     ' Otherwise we just connect to the default domain 
     Set objRootDSE = GetObject("LDAP://RootDSE") 
     strDNSDomain = objRootDSE.Get("defaultNamingContext") 
    End If 

    strBase = "<LDAP://" & strDNSDomain & ">" 
    ' Setup ADO objects. 
    Set adoCommand = CreateObject("ADODB.Command") 
    Set ADOConnection = CreateObject("ADODB.Connection") 
    ADOConnection.Provider = "ADsDSOObject" 
    ADOConnection.Open "Active Directory Provider" 
    adoCommand.ActiveConnection = ADOConnection 


    ' Filter on user objects. 
    'strFilter = "(&(objectCategory=person)(objectClass=user))" 
    strFilter = "(&(objectClass=" & strObjectType & ")(" & strSearchField & "=" & strObjectToGet & "))" 

    ' Comma delimited list of attribute values to retrieve. 
    strAttributes = strCommaDelimProps 
    arrProperties = Split(strCommaDelimProps, ",") 

    ' Construct the LDAP syntax query. 
    strQuery = strBase & ";" & strFilter & ";" & strAttributes & ";subtree" 
    adoCommand.CommandText = strQuery 
    ' Define the maximum records to return 
    adoCommand.Properties("Page Size") = 100 
    adoCommand.Properties("Timeout") = 30 
    adoCommand.Properties("Cache Results") = False 

    ' Run the query. 
    Set adoRecordset = adoCommand.Execute 
    ' Enumerate the resulting recordset. 
    strReturnVal = "" 
    Do Until adoRecordset.EOF 
     ' Retrieve values and display. 
     For intCount = LBound(arrProperties) To UBound(arrProperties) 
      If strReturnVal = "" Then 
       strReturnVal = adoRecordset.Fields(intCount).Value 
      Else 
       strReturnVal = strReturnVal & vbCrLf & adoRecordset.Fields(intCount).Value 
      End If 
     Next 
     ' Move to the next record in the recordset. 
     adoRecordset.MoveNext 
    Loop 

    ' Clean up. 
    adoRecordset.Close 
    ADOConnection.Close 
    Get_LDAP_User_Properties = strReturnVal 

End Function 

Kann mir bitte jemand zeigen, wo ich falsch liege?

+2

Sie sollten ihre lokale Variablen und Ihre Funktionen Rückgabetypen und Parameter deklarieren. Ohne 'Option Explicit', das oben in einem Modul angegeben ist, kompiliert VBA gerne einen Tippfehler, was Probleme schwieriger zu debuggen macht als nötig. Nun scheint es, als würden Sie die 'DisplayName'-Eigenschaft abrufen, von der vernünftigerweise angenommen werden kann, dass sie" Smith, Dave "ist. Haben Sie versucht, die Eigenschaften aufzuzählen und zu sehen, ob es nicht noch eine andere gibt, die geeigneter wäre? –

Antwort

0

Ich habe diesen Code verwendet, um den Benutzernamen des Benutzers zu erhalten.

Option Explicit 
Public strUser As String 
Private Sub Workbook_Open() 
Dim strUser 

    strUser = CreateObject("WScript.Network").UserName 

End Sub 
+1

Ich denke, OP sucht nach dem Benutzernamen, basierend auf dem Wert in einer Zelle. Dies kann oder muss nicht unbedingt der aktive Benutzer sein, es sei denn, ich missverstehe die Frage. – BruceWayne

1

Sie können es auf zwei Arten tun. 1. Teilen Sie den displayName auf "," und ordnen Sie ihn neu an.

struserdn = Get_LDAP_User_Properties("user", "samAccountName", strUser, "displayName") 
    struserdn = Split(struserdn, ",")(1) & Space(1) & Split(struserdn, ",")(0) 

2.You kann Vorname und Nachname in separaten Anrufe erhalten mit GivenName und sn params.

strFirstName = Get_LDAP_User_Properties("user", "samAccountName", strUser, "givenName") strLastName = Get_LDAP_User_Properties("user", "samAccountName", strUser, "sn")

Aber thi smethod wird zweimal die Verwendung von Ressourcen.

Edit:

Per Matts Kommentar.

Ändern Sie diese Zeile

strReturnVal = strReturnVal & vbcrlf & adoRecordset.Fields(intCount).Value 

Um

strReturnVal = strReturnVal & "." & adoRecordset.Fields(intCount).Value 

und dann wird dieser Sie den vollständigen Namen geben in einem Aufruf nur.

strFullName = Get_LDAP_User_Properties("user", "samAccountName", strUser, "givenName,sn") 
+2

* Aber diese Methode wird zweimal die Verwendung von Ressourcen * - OP-Funktion nimmt eine * durch Kommas getrennte Liste von Eigenschaften * ... und gibt die Werte getrennt durch eine 'vbCrLf'. Sie können einfach "givenName, sn" für den letzten Parameter angeben und die zurückgegebene Zeichenfolge auf "vbCrLf" aufteilen, dann mit einem Punkt verbinden und die Datei "@ inbox.com" hinzufügen, indem Sie einen einzigen Aufruf von "Get_LDAP_User_Properties" ausführen. –

+0

Danke !!! Die Antwort zur Umsetzung Ihres Vorschlags wurde aktualisiert. – cyboashu

+1

Nicht ganz - ich glaube nicht, dass 'Get_LDAP_User_Properties' irgendwelche Änderungen erfordert (abgesehen von der Deklaration der Locals und des Rückgabetyps und der Parametertypen, und die Parameter sollten' ByVal' übergeben werden) schädlich sein, wenn die Funktion anderweitig für andere Zwecke verwendet wird. Was ich meinte, war 'Ergebnis = Join (Split (Get_LDAP_User_Properties (" Benutzer "," SamAccountName ", StrUser," GivenName, Sn "), VbCrLf),". ") &" @ Inbox.com "' –

3

Bitte kann mir jemand zeigen, wo ich falsch gehe?

Sie verlangen für die displayName, und das ist, was Sie bekommen ("Doe, John"). Was Sie wollen, ist nicht der "Anzeigename", sondern der Vor- und Nachname des Benutzers.

die bei der Unterzeichnung für die Funktion aussehen Lassen Sie hier haben:

Function Get_LDAP_User_Properties(strObjectType, strSearchField, strObjectToGet, strCommaDelimProps) 

Die letzten Parameter strCommaDelimProps, die Abkürzung für „string, durch Komma getrennte Eigenschaftsnamen“ genannt wird.

Wenn Sie an, was aussehen es tut mit der strCommaDelimProps Sie es gibst, werden Sie feststellen, ist es in der strQuery verketteten, die auf dem LDAP-Server gesendet wird, und dann ist es auch in einem Array gedreht arrProperties genannt (Gosh dat ungarische Namensgebung):

arrProperties = Split(strCommaDelimProps, ",") 

Dann ist es durch die Abfrageergebnisse Schleifen und ...

strReturnVal = strReturnVal & vbCrLf & adoRecordset.Fields(intCount).Value 

das ist richtig, fügt er jedes Feld Wert auf den strReturnVal Zeichenfolge, wobei jedes Ergebnis durch eine vbCrLf getrennt wird.

Wenn Sie also der Funktion zwei durch Kommata getrennte Eigenschaften geben würden, würde Ihnen eine Zeichenfolge mit den zwei Werten zurückgegeben, die durch vbCrLf Zeichen getrennt sind. Das wäre in etwa so aussehen:

"John[CRLF] 
Doe" 

So können Sie diese Zeichenfolge nehmen, Split es auf vbCrLf, um ein Array zu machen, und Join es mit einem Punkttrennzeichen (.):

strParts = Get_LDAP_User_Properties("user", "samAccountName", strUser, "givenName,sn") 
arrParts = Split(strParts, vbCrLf) 'splits the string into an array 
result = Join(arrParts, ".") 'joins array elements back into a string 

Die beiden Eigenschaften sind, per cyboashu's answer, "givenName" und "sn", so geben Sie die Funktion "givenName,sn" für den letzten Parameter.

An diesem Punkt sieht die result Zeichenfolge so aus wie John.Doe; Sie könnten, dass die Klein machen wollen, bevor Sie den @inbox.com Teil verketten:

result = LCase$(result) & "@inbox.com" 
MsgBox result 

Was , was mache ich falsch?, die neueste Rubberduck (mein kleines Haustier Projekt) können Sie ein paar Dinge identifizieren helfen:

Warning: 'Vbnullstring' preferred to empty string literals - (Book2) VBAProject.Module1, line 69 
Warning: 'Vbnullstring' preferred to empty string literals - (Book2) VBAProject.Module1, line 73 
Warning: Parameter 'strObjectType' is implicitly Variant - (Book2) VBAProject.Module1, line 11 
Warning: Parameter 'strSearchField' is implicitly Variant - (Book2) VBAProject.Module1, line 11 
Warning: Parameter 'strObjectToGet' is implicitly Variant - (Book2) VBAProject.Module1, line 11 
Warning: Parameter 'strCommaDelimProps' is implicitly Variant - (Book2) VBAProject.Module1, line 11 
Warning: Member 'Range' implicitly references ActiveSheet - (Book2) VBAProject.Module1, line 2 
Hint: Member 'Test' is implicitly public - (Book2) VBAProject.Module1, line 1 
Hint: Member 'Get_LDAP_User_Properties' is implicitly public - (Book2) VBAProject.Module1, line 11 
Hint: Parameter 'strObjectType' is implicitly passed by reference - (Book2) VBAProject.Module1, line 11 
Hint: Parameter 'strSearchField' is implicitly passed by reference - (Book2) VBAProject.Module1, line 11 
Hint: Parameter 'strObjectToGet' is implicitly passed by reference - (Book2) VBAProject.Module1, line 11 
Hint: Parameter 'strCommaDelimProps' is implicitly passed by reference - (Book2) VBAProject.Module1, line 11 
Hint: Return type of member 'Get_LDAP_User_Properties' is implicitly 'Variant' - (Book2) VBAProject.Module1, line 11 
Error: Option Explicit is not specified in 'Module1' - (Book2) VBAProject.Module1, line 1 
Error: Local variable 'strUser' is not declared - (Book2) VBAProject.Module1, line 2 
Error: Local variable 'struserdn' is not declared - (Book2) VBAProject.Module1, line 3 
+0

Huh, sieht so aus Es gibt einen Fehler in der Inspektion "nicht deklarierte Variable", es sollte viel mehr Ergebnisse als das feuern. –

Verwandte Themen