【问题标题】:vb.net active directory question - rename user account and mailboxvb.net 活动目录问题 - 重命名用户帐户和邮箱
【发布时间】:2009-06-29 19:08:24
【问题描述】:

我正在尝试以编程方式重命名用户,但无法确定邮箱部分(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

【问题讨论】:

    标签: .net vb.net proxy active-directory directoryservices


    【解决方案1】:

    如果我没记错的话,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 等。

    确保您谨慎对待每个价值。您不想编写脚本然后在您的域中运行它并炸毁所有帐户

    【讨论】:

    • 正确的是它是一个数组,我曾考虑过使用 add 方法,但希望我错过了一个简单的重命名方法(比如重命名 cn 时)。我将测试以下添加代码以删除旧的 smtp/x400 地址并在它有效时回发。谢谢。 ...在使用 adsiedit 浏览用户 LDAP 参数时,我注意到另外两个应该更改(手头没有信息,将重新发布)。想要一个简单的重命名方法,如果没有什么是 .Net 原生的,我会重新发布我想出的内容。
    • 您的代码运行良好,最终代码在上面。我还必须更改 legacyExchangeDN 和 textEncodedORAddress。
    【解决方案2】:

    如果您使用的是 .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
    

    【讨论】:

    • 谢谢,我会试一试。如果它使用 System.DirectoryServices 完成上述操作,那么我认为这会很棒。我遇到了 DS.AccountManagement 的一些问题,它只枚举启用的用户,我不知道如何限制当前 OU 和子 OU 之间的查询,所以我在这个任务上远离它。再次感谢。
    • 当然。希望它成功。我没有同样的需求,所以我只能根据文档保证它应该
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 2018-05-03
    相关资源
    最近更新 更多