vb.net вопрос активного каталога - переименуйте учетную запись пользователя и почтовый ящик - PullRequest
1 голос
/ 29 июня 2009

Я пытаюсь переименовать пользователя программно и не могу понять часть почтового ящика (proxyAddresses). Любая помощь приветствуется ...

Рабочий код ниже ...

Public Shared Function renameUser(ByVal curUsername As String, ByVal newUsername As String) As Boolean
    Dim emailSuffix As String = "@here.com"
    Dim userPrincipalSuffix As String = "@here.now"

    Dim user As New DirectoryEntry
    Dim oSearcher As DirectorySearcher = Nothing
    Dim oRoot As DirectoryEntry = Nothing
    Dim oResult As SearchResult
    Try
        oRoot = New DirectoryEntry("LDAP://" & "ldapserver" & _
                  "/" & "OU=OUWithUsersToChange,OU=Site Users,DC=here,DC=now")
        oSearcher = New DirectorySearcher(oRoot)
        oSearcher.SearchScope = SearchScope.Subtree

        oSearcher.Filter = "(&(objectCategory=person)(sAMAccountName=" & curUsername & "))"
        oSearcher.PropertiesToLoad.Add("uid")
        oSearcher.PropertiesToLoad.Add("mail")
        oSearcher.PropertiesToLoad.Add("mailNickname")
        oSearcher.PropertiesToLoad.Add("userPrincipalName")
        oSearcher.PropertiesToLoad.Add("sAMAccountName")
        oSearcher.PropertiesToLoad.Add("proxyAddresses")
        oSearcher.PropertiesToLoad.Add("textEncodedORAddress")
        oSearcher.PropertiesToLoad.Add("legacyExchangeDN")

        oResult = oSearcher.FindOne
        user = oResult.GetDirectoryEntry

        Dim lNewList As New List(Of String)
        For Each sAddress As String In user.Properties("proxyAddresses")
            lNewList.Add(sAddress.Replace(curUsername, newUsername))
        Next
        Dim sTextEncodedORAddress As String = user.Properties.Item("textEncodedORAddress").Value
        Dim sLegacyExchangeDN As String = user.Properties.Item("legacyExchangeDN").Value

        user.Properties.Item("uid").Value = newUsername
        user.Properties.Item("mail").Value = newUsername & emailSuffix
        user.Properties.Item("mailNickname").Value = newUsername
        user.Properties.Item("userPrincipalName").Value = newUsername & userPrincipalSuffix
        user.Properties.Item("sAMAccountName").Value = newUsername
        user.Properties("proxyAddresses").Value = lNewList.ToArray
        user.Properties.Item("textEncodedORAddress").Value = sTextEncodedORAddress.Replace(curUsername, newUsername)
        user.Properties.Item("legacyExchangeDN").Value = sLegacyExchangeDN.Replace(curUsername, newUsername)

        user.CommitChanges()
        user.Rename("CN=" & newUsername)

        Return True
    Catch ex As Exception
        Return False
    Finally
        user.Dispose()
        oRoot.Dispose()
        oSearcher.Dispose()
        oResult = Nothing
    End Try
End Function

Ответы [ 2 ]

1 голос
/ 30 июня 2009

Если я правильно помню, proxyAddresses - это на самом деле массив, а не одно значение. К нему также добавляется информация о типе адреса ...

Внимание! Впереди уродливый код!

Это некоторый код, который я использовал ранее, поэтому измените основной адрес электронной почты для учетных записей пользователей и сохраните прежние адреса (как при переключении основных имен доменов). Это может помочь вам внести изменения

Dim lNewList As New List(Of String)
sPrimaryAddress = sPrimaryAddress.Split("@")(0) & "@" & "example.com"
lNewList.Add("SMTP:" & sPrimaryAddress)
For Each sAddr As String In lPrevList
    lNewList.Add(sAddr) 'which will be a list of values like "smtp:someone@domain.com"'
Next

Dim oUser As DirectoryEntry = oResult.GetDirectoryEntry()
oUser.Properties("mail").Value = sPrimaryAddress
oUser.Properties("ProxyAddresses").Value = lNewList.ToArray()
oUser.CommitChanges()

lPrevList был списком адресов электронной почты, которые пользователь уже прикрепил к своему профилю. Их основной адрес начинается с SMTP: , а остальные начинаются с smtp: (строчные буквы). Вы можете использовать другие значения, такие как x400 и т. Д.

Убедитесь, что вы внимательно относитесь к каждому значению. Вы не хотите писать скрипт, а затем запускать его через свой домен и взорвать все аккаунты

0 голосов
/ 30 июня 2009

Если вы используете .Net Framework 3.5 или выше, вам, вероятно, лучше использовать System.DirectoryServices.AccountManagement. Это делает вопрос получения правильного UserPrinciple, изменения свойства Name и вызова метода Save. Это может выглядеть примерно так:

Dim pc As New PrincipalContext(ContextType.Domain, "COMPANY")
Dim up As UserPrincipal = UserPrincipal.FindByIdentity(pc, curUsername)
up.Name = newUsername
up.Save
...