2011-12-02 1 views
2

J'essaie de créer/activer une boîte aux lettres sur un serveur Exchange 2010 à partir du code C#. Partout où je regarde, je vois des personnes utilisant le code ci-dessous.Activer Exchange 2010 boîte aux lettres

Cependant je reçois l'erreur suivante:

Le terme « Enable-Mailbox » n'est pas reconnu comme étant le nom d'une applet de commande, fonction, fichier de script ou d'un programme opérationnel. Vérifiez l'orthographe du nom ou, si un chemin a été inclus, vérifiez que le chemin est correct et réessayez.

Qu'est-ce que je fais mal?

 SecureString password = new SecureString(); 

     string str_password = "myPassword"; 
     string username = "myUsername"; 

     //FQDN is ofcourse the (fully qualified) name of our exchange server.. 
     string liveIdconnectionUri = "http://FQDN/Powershell?serializationLevel=Full"; 

     foreach (char x in str_password) 
     { 
      password.AppendChar(x); 
     } 

     PSCredential credential = new PSCredential(username, password); 

     WSManConnectionInfo connectionInfo = new WSManConnectionInfo((new Uri(liveIdconnectionUri)), "http://schemas.microsoft.com/powershell/Microsoft.Exchange", credential); 
     connectionInfo.AuthenticationMechanism = AuthenticationMechanism.Default; 

     Runspace runspace = System.Management.Automation.Runspaces.RunspaceFactory.CreateRunspace(connectionInfo); 
     PowerShell powershell = PowerShell.Create(); 
     PSCommand command = new PSCommand(); 

     command.AddCommand("Enable-Mailbox"); 
     command.AddParameter("Identity", "domainname.ltd/OUName/TestAcc Jap"); 
     command.AddParameter("Alias", "TestAccJap"); 
     command.AddParameter("Database", "DB-Name"); 

     powershell.Commands = command; 

     try 
     { 
      runspace.Open(); 
      powershell.Runspace = runspace; 
      powershell.Invoke(); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
     finally 
     { 
      runspace.Dispose(); 
      runspace = null; 
      powershell.Dispose(); 
      powershell = null; 
     } 
+0

double possible de [Comment puis-je créer un échange 2010 programatically boîte aux lettres en utilisant C#] (http://stackoverflow.com/questions/3398056/how-do-i-programatically-create-an-exchange-2010 -mailbox-using-c-sharp). Veuillez lire le premier paragraphe de la réponse acceptée - est-ce que cela aide? –

+0

Quelques exemples: http: //busbar.blogspot.com/2010/05/exhcange-2010-using-c-and-aspnet-to.html http://blog.pedroliska.com/2011/07/28/create-an-exchange-2010-mailbox-from-a-remote-c-program/ – jagsler

+0

Lorsque j'essaie le code de la réponse acceptée, j'obtiens l'erreur suivante: Aucun composant logiciel enfichable n'a été enregistré pour Windows PowerShell version 2. – jagsler

Répondre

1

Il s'agit probablement d'une erreur liée à la fonctionnalité PowerShell. Si vous exécutez le code à partir d'une machine distante (pas le serveur Exchange), vous devez activer l'accès PowerShell distant pour l'utilisateur concerné et vous assurer que le ou les pare-feu autorisent les connexions au serveur Exchange sur le port 80. serveur:

Set-User –identity username –RemotePowershellEnabled $True 

L'utilisateur doit également être membre d'un rôle de gestion d'échange permettant la création de boîte aux lettres.

Si vous utilisez un balanseur de charge et/ou avez un groupe de disponibilité de base de données, vous devrez peut-être configurer un autre compte de service pour activer l'authentification Kerberos. Voir http://technet.microsoft.com/en-us/library/ff808313.aspx pour plus de détails. Je devais activer cela pour faire fonctionner le code dans mon environnement. J'ai modifié le code un peu pour tester si j'étais capable d'exécuter des commandes d'échange de powershell. Le code suivant répond avec le nom complet de l'utilisateur USERIDENT en cas de succès.

static void Main(string[] args) 
{ 
    SecureString password = new SecureString(); 
    string str_password = "PASS"; 
    string username = "domain\\user"; 

    //FQDN is ofcourse the (fully qualified) name of our exchange server.. 
    string liveIdconnectionUri = "http://SERVERFQDN/Powershell?serializationLevel=Full"; 
    foreach (char x in str_password) 
    { 
     password.AppendChar(x); 
    } 
    PSCredential credential = new PSCredential(username, password); 
    WSManConnectionInfo connectionInfo = new WSManConnectionInfo((new Uri(liveIdconnectionUri)), "http://schemas.microsoft.com/powershell/Microsoft.Exchange", credential); 
    Runspace runspace = null; 
    PowerShell powershell = PowerShell.Create(); 
    PSCommand command = new PSCommand(); 
    command.AddCommand("Get-Mailbox"); 
    command.AddParameter("Identity", "USERIDENT"); 
    powershell.Commands = command; 
    try 
    { 
     connectionInfo.AuthenticationMechanism = AuthenticationMechanism.Default; 
     runspace = System.Management.Automation.Runspaces.RunspaceFactory.CreateRunspace(connectionInfo); 
     runspace.Open(); 
     powershell.Runspace = runspace; 
     Collection<PSObject> commandResults = powershell.Invoke<PSObject>(); 
     foreach (PSObject result in commandResults) 
     { 
      Console.WriteLine(result.ToString()); 
     } 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.Message); 
    } 
    finally 
    { 
     runspace.Dispose(); 
     runspace = null; 
     powershell.Dispose(); 
     powershell = null; 
    } 

} 
+0

Je l'ai déjà testé avec un code PowerShell normal, puis tout fonctionne. J'ai couru Set-User -identity nom d'utilisateur -RemotePowershellEnabled $ True que vous avez mentionné ci-dessus juste pour être sûr, mais encore une fois le code que j'ai montré dans ma question ne fait qu'exprimer une erreur avec: Le terme 'Enable-Mailbox' n'est pas reconnu comme nom d'une cmdlet, functi .... et c'est parce que le composant logiciel enfichable n'est pas chargé je suppose? – jagsler

+0

Essayez d'utiliser connectionInfo.AuthenticationMechanism = AuthenticationMechanism.Basic; au lieu de défaut. – BlackCat

+0

J'ai changé et j'ai eu quelques nouvelles erreurs, j'ai corrigé la plupart d'entre eux mais je suis actuellement bloqué à l'erreur suivante. La prochaine partie dans le commentaire suivant. La connexion au serveur distant a échoué avec le message d'erreur suivant: Le client WinRM ne peut pas traiter la demande. Le mécanisme d'authentification demandé par le client n'est pas pris en charge par le serveur ou le trafic non chiffré est désactivé dans la configuration du service. Vérifiez le paramètre de trafic non crypté dans la configuration du service ou spécifiez l'un des mécanismes d'authentification pris en charge par le serveur. – jagsler

Questions connexes