.net 作为服务运行时未找到PowerShell模块

.net 作为服务运行时未找到PowerShell模块,.net,powershell,service,office365,.net,Powershell,Service,Office365,我有一个向用户分配Office 365许可证的项目。有一个web项目,允许管理员查看可用的许可证并为用户选择许可证。在后台,有一个服务每15分钟执行一次实际的许可证分配(以及许多其他任务)。我们不直接分配许可证的原因是,用户可能尚未同步到Office 365。如果DirSync尚未运行,服务将在稍后自动重试 回到我的问题:到Office 365的连接正在使用PowerShell模块“MSOnline”。问题是服务无法加载此模块。我总是收到标准错误消息: 未加载指定的模块“MSOnline”,因为

我有一个向用户分配Office 365许可证的项目。有一个web项目,允许管理员查看可用的许可证并为用户选择许可证。在后台,有一个服务每15分钟执行一次实际的许可证分配(以及许多其他任务)。我们不直接分配许可证的原因是,用户可能尚未同步到Office 365。如果DirSync尚未运行,服务将在稍后自动重试

回到我的问题:到Office 365的连接正在使用PowerShell模块“MSOnline”。问题是服务无法加载此模块。我总是收到标准错误消息:

未加载指定的模块“MSOnline”,因为在任何模块目录中都找不到有效的模块文件

web应用程序没有这个问题。例如,它可以连接并检索可用的许可证。如果我在LINQPad中使用来自服务应用程序的代码,或者将其作为一个小型的独立可执行文件使用,那么一切都可以正常工作。只有服务无法加载模块。有人能帮我吗

web应用程序和服务都使用以下代码段来连接到Office 365(简化代码以增加可读性)

var iss=InitialSessionState.CreateDefault();
iss.ThrowOnRunspaceOpenError=true;
iss.AuthorizationManager=新的AuthorizationManager(“MyPowerShellInvoker”);
iss.ImportPSModule(“MSOnline”);
_runspace=RunspaceFactory.CreateRunspace(iss);
_Open();
_invoker=newrunspaceinvoke(_runspace);
使用(管道管道=\u运行空间.CreatePipeline())
{
var cmd=新命令(“连接MsolService”);
cmd.Parameters.Add(“凭证”、/*PSCredential对象*/);
pipeline.Commands.Add(cmd);
pipeline.Invoke();
}

备注:该服务在“本地系统”帐户下运行。

您的服务是以32位还是64位目标运行的。我在多种情况下遇到了32/64问题。

您的PSModulePath环境变量是否包含MSOnline模块所在的路径?@DavidBrabant很遗憾,是的,
PSModulePath
是正确的。web应用程序和服务的值相同。您的服务是作为32位还是64位目标运行的。这可能会有一些影响。所以我把它作为一个答案。这就是问题所在。尽管平台目标是
任何CPU
,但我直到现在都没有注意到一个复选框(“首选32位”)被选中。所以服务是以32位模式运行的。取消选中此选项是解决方案。节省了我很多时间!