对于我的一个应用程序,我有一个 Windows 服务(在 Windows Server 2012 R2 x64 上),其作用是根据不同的计划和触发器执行许多作业。其中之一是重置 Office 365 上的用户密码。运行该服务的服务器安装了 Microsoft Online Services 登录助手和适用于 Windows PowerShell 的 Microsoft Azure Active Directory 模块(MSOnline 版本 1.1.166.0)。
从 PowerShell 我可以成功地与我的用户一起调用以下命令。
$> $cred = Get-Credential
$> Connect-MsolService -Credential $cred
如果我以启动服务的帐户运行 PowerShell,它也能正常运行。从 Windows 服务运行重置密码功能失败,并显示以下消息:
The term 'Connect-MsolService' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
在代码中向模块导入添加调试标志,使我们能够将问题拖到 import-module MSOnline 命令。我们收到错误:
The specified module 'MSOnline' was not loaded because no valid module file was found in any module directory.
我们已经尝试删除并重新安装 x64 版本中的两个工具(Microsoft Online Services 登录助手和适用于 Windows PowerShell 的 Microsoft Azure Active Directory 模块)。系统变量“PATH”正确为:%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\Program Files\Microsoft\Web Platform Installer\
文件夹 C:\Windows\System32\WindowsPowerShell\v1.0\Modules 包含 MSOL 模块子文件夹 MSOnline 和 MSOnlineExtended
复制 C:\Windows\sysWOW64\WindowsPowerShell\v1.0\Modules 中的两个文件夹(如许多其他主题中报告的解决方案)失败,并出现以下错误:
System.Management.Automation.CmdletInvocationException: Could not load file or assembly 'file:///C:\Windows\system32\WindowsPowerShell\v1.0\Modules\MSOnline\Microsoft.Online.Administration.Automation.PSModule.dll' or one of its dependencies. An attempt was made to load a program with an incorrect format. ---> System.BadImageFormatException: Could not load file or assembly
用于 Windows 服务的代码已经作为单独的工具在同一台服务器上成功运行和测试,并且该代码也在开发人员的机器上完美运行。
这些调查让我们认为服务本身存在某种问题,但无法找出问题所在和原因。
谢谢。
答案1
我们找到了问题所在。在项目属性中将目标平台构建参数更改为“首选 32 位”即可解决该问题。