2011-09-23 5 views
0

J'utilise un service système Windows pour créer une boîte aux lettres dans Ecxhange 2007 à l'aide de Powershell. Comme il s'exécute en tant que service système, j'emballe l'appel powershell en utilisant l'emprunt d'identité (en utilisant advapi32.dll) pour l'exécuter en tant qu'utilisateur avec les autorisations d'échange appropriées, cependant, je reçois le message d'erreur suivant.Erreur lors de l'utilisation de l'emprunt d'identité avec Powershell et Exchange 2007 à partir de C#

Impossible de charger le composant logiciel enfichable Windows PowerShell Microsoft.Exchange.Management.PowerShell.Admin en raison de l'erreur suivante: L'initialiseur de type pour 'Microsoft.Exchange.Data.Directory.Globals' a généré une exception.

Il existe un article Microsoft KB (KB943937) décrivant ce problème et le correctif est d'installer l'échange SP1 RU1, mais je suis actuellement en cours d'exécution SP3 RU1. J'utilise le paramètre -DomainController comme spécifié dans l'article de la base de connaissances mais je reçois toujours la même erreur.

Si j'exécute le service en tant qu'utilisateur que j'emprunte l'identité le code fonctionne bien donc je ne pense pas que ce soit un problème avec le code. J'ai essayé d'exécuter ceci sur Windows XP et Server 2008 avec le même problème.

L'appel System.Security.Principal.WindowsIdentity.GetCurrent().Name avant le code powershell je peux voir que l'emprunt d'identité fonctionne correctement.

Est-ce que quelqu'un a déjà rencontré ça?

+0

Essayez de lire cette réponse http://stackoverflow.com/questions/11806/how-do-you-impersonate-an-active-directory-user-in-powershell –

+0

@Smallpygmy bon vous l'avez compris - je pense Serais bien si vous avez posté votre edit comme une réponse et l'a marqué comme tel. :-) – Matt

Répondre

1

Pour quiconque rencontrant cela à l'avenir, le problème était avec où l'usurpation d'identité commençait.

Vous devez démarrer l'emprunt d'identité après avoir ajouté le composant logiciel enfichable, mais avant de créer l'espace d'exécution.

RunspaceConfiguration rsconfig = RunspaceConfiguration.Create(); 
PSSnapInException snapInException = null; 
PSSnapInInfo info = rsconfig.AddPSSnapIn("Microsoft.Exchange.Management.PowerShell.Admin", out snapInException); 
BeginImpersonation(); 
myRunspace = RunspaceFactory.CreateRunspace(rsconfig); 

Voir l'article this pour le code source complet.

+0

Où obtenez-vous la DLL pour l'importation afin que vous puissiez utiliser la méthode 'BeginImpersonation()'? – BRogers

Questions connexes