Для одного из моих приложений у меня есть служба Windows (на Windows Server 2012 R2 x64), роль которой заключается в выполнении множества заданий по разным расписаниям и триггерам. Один из них - сброс пароля пользователя в Office 365. На сервере, на котором работает служба, установлены помощник по входу в Microsoft Online Services и модуль Microsoft Azure Active Directory для Windows PowerShell (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 и модуль Microsoft Azure Active Directory для Windows PowerShell). Системная переменная "PATH" верна с:% SystemRoot% \ system32;% SystemRoot%;% SystemRoot% \ System32 \ Wbem;% SYSTEMROOT% \ System32 \ WindowsPowerShell \ v1.0 \; C: \ Program Files \ Microsoft \ Web Platform Установщик \
В папке 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, был запущен и успешно протестирован как отдельный инструмент на том же сервере, и этот код также был безупречно запущен на машине разработчика.
Эти исследования заставляют нас думать, что есть какая-то проблема с самой службой, но мы не можем понять, что / почему.
Спасибо.
Мы нашли проблему. Изменение параметра сборки целевой платформы на «Предпочитать 32-битный» в свойствах проекта решило проблему.