2009-06-29 9 views
1

J'essaie de renommer un utilisateur par programme et ne peux pas comprendre la pièce de la boîte aux lettres (proxyAddresses). Toute aide est appréciée ...vb.net question de répertoire actif - renommer le compte d'utilisateur et la boîte aux lettres

Code de travail ci-dessous ...

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 

Répondre

1

Si je me souviens bien, proxyAddresses est en fait un tableau, pas une seule valeur. Il est également préfixé avec des informations sur le type d'adresse, il est ...

Attention: Code laid à venir!

Il s'agit d'un code que j'avais utilisé auparavant, donc changez l'adresse de messagerie principale pour les comptes d'utilisateur et conservez les adresses précédentes (comme dans le changement de noms de domaine primaires). Cela pourrait vous aider à faire vos modifications

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:[email protected]"' 
Next 

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

lPrevList était une liste des adresses e-mail à l'utilisateur avait déjà attaché à son profil. Leur adresse principale commence par SMTP: tandis que les autres commencent par smtp: (minuscules). Vous pouvez courir vers d'autres valeurs comme x400, etc.

Assurez-vous de traiter chaque valeur avec soin. Vous ne voulez pas écrire un script et puis l'exécuter sur votre domaine et faire exploser tous les comptes

+0

raison de dire qu'il est un tableau, j'ai pensé à utiliser la méthode add, mais espérait que je manquais une méthode simple de changement de nom (comme lors du renommage cn). Je vais tester l'ajout suivant dans le code pour supprimer les anciennes adresses smtp/x400 et les renvoyer si cela fonctionne. Merci. ... En passant en revue les paramètres LDAP de l'utilisateur avec adsiedit j'ai remarqué deux autres qui devraient être changés (ne pas avoir d'informations en main, repost). J'adorerais une méthode de renommer simple, si rien n'est originaire de .Net, je vais publier ce que je viens avec. –

+0

Votre code a bien fonctionné, le code final est ci-dessus. Je devais aussi changer legacyExchangeDN et textEncodedORAddress. –

0

Si vous utilisez le .Net Framework 3.5 ou mieux, vous êtes probablement mieux d'utiliser System.DirectoryServices. Gestion de compte. Cela permet d'obtenir le UserPrinciple correct, de modifier la propriété Name et d'appeler la méthode Save. Il pourrait ressembler à ceci:

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

Merci, je vais essayer. S'il fait ce que ci-dessus fait avec System.DirectoryServices alors je pense que ce sera génial. J'ai rencontré des problèmes avec DS.AccountManagement où il a seulement énuméré les utilisateurs activés et je ne pouvais pas comprendre comment limiter les requêtes entre les unités d'organisation et les sous-unités actuelles, je suis donc resté loin de cette tâche. Merci encore. –

+0

Bien sûr. J'espère que ça fonctionne. Je n'ai pas eu le même besoin donc je peux seulement garantir qu'il * devrait * selon la documentation. –