[System.Reflection.Assembly] :: Load (byte []) не удалось: система не может найти указанный файл - PullRequest
0 голосов
/ 28 июня 2019

Я получил службу Windows, написанную на C #, которая выполняет команду Powershell. Он пытается загрузить DLL хранилища Azure и завершается неудачей.

$bytes = [System.IO.File]::ReadAllBytes($azureStorageDll) // local path of the dll
[System.Reflection.Assembly]::Load($bytes) | Out-Null

DLL находится в пакете версии 9.0.0. И ошибка Exception calling "Load" with "1" argument(s): "Could not load file or assembly 'Microsoft.WindowsAzure.Storage, Version=9.3.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified.

Интересно, что если я запускаю службу Windows под своими учетными данными, она работает. Но происходит сбой при запуске под учетной записью бота. И 9.3.2 даже не последняя версия

Я попытался распечатать GAC под учетной записью бота, но не вижу ничего, связанного с хранилищем Azure

$n1 = New-PSDrive -Name HKCR -PSProvider 'Microsoft.PowerShell.Core\Registry' -Root HKEY_CLASSES_ROOT
$n2 = Get-ItemProperty -Path 'HKCR:\Installer\Assemblies\Global' | Get-Member -MemberType NoteProperty

Я понимаю, что при загрузке dll существуют различные контексты. Но я не знаю, как это отладить? Может ли кто-нибудь помочь с некоторыми предложениями?

1 Ответ

1 голос
/ 28 июня 2019

Попробуйте включить ведение журнала Fusion, затем войти в Windows от имени пользователя бота и попытаться загрузить DLL.Журналы Fusion, вероятно, покажут, что существует зависимая DLL, которая недоступна для чтения вашей учетной записи службы, возможно, из-за разрешений файловой системы.

Вот скрипт Powershell , который упрощает переключение состояния ведения журнала Fusion:

Param( $LogPath = "c:\temp\Fusion" )

#restart as admin if not started as admin 
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { 
    Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`"" -PassThru -Verb RunAs | Out-null; exit 
}
$RegKey = 'HKLM:\SOFTWARE\Microsoft\Fusion'
If(!(Test-Path $RegKey)) {New-Item -Path $RegKey -ItemType Container | Out-Null}
$NewValue = If((Get-ItemProperty $RegKey).EnableLog -eq 1){0} Else {1}
Set-ItemProperty -Path $RegKey -Name EnableLog        -Value $NewValue -Type DWord
Set-ItemProperty -Path $RegKey -Name ForceLog         -Value $NewValue -Type DWord
Set-ItemProperty -Path $RegKey -Name LogFailures      -Value $NewValue -Type DWord
Set-ItemProperty -Path $RegKey -Name LogResourceBinds -Value $NewValue -Type DWord
Set-ItemProperty -Path $RegKey -Name LogPath          -Value $LogPath  -Type String
If(!(Test-Path $LogPath -PathType Container)){New-Item $LogPath -ItemType Directory | Out-Null}
Write-Host "$(If($NewValue -eq 1){'Enabled'}Else{'Disabled'}) Fusion Logging at $LogPath"
If(!$Host.Name.Contains("ISE")){Pause}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...