Вопрос или проблема
Я создал центральный репозиторий для модулей PowerShell, но у меня возникли проблемы с загрузкой одного из них. Модуль NTFSSecurity не удается импортировать, с следующим сообщением.
PS Z:\> Import-Module NTFSSecurity
Add-Type : Не удалось загрузить файл или сборку 'file://\\fs\PowerShellModules\NTFSSecurity\Security2.dll' или одну из её зависимостей. Операция не поддерживается. (Исключение из HRESULT: 0x80131515)
На \\fs\PowerShellModules\NTFSSecurity\NTFSSecurity.Init.ps1:141 символ:1
+ Add-Type -Path $PSScriptRoot\Security2.dll
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Add-Type], FileLoadException
+ FullyQualifiedErrorId : System.IO.FileLoadException,Microsoft.PowerShell.Commands.AddTypeCommand
Add-Type : Не удалось загрузить файл или сборку 'file://\\fs\PowerShellModules\NTFSSecurity\PrivilegeControl.dll' или одну из её зависимостей. Операция не поддерживается. (Исключение из HRESULT: 0x80131515)
На \\fs\PowerShellModules\NTFSSecurity\NTFSSecurity.Init.ps1:142 символ:1
+ Add-Type -Path $PSScriptRoot\PrivilegeControl.dll -ReferencedAssemblies $PSScrip ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Add-Type], FileLoadException
+ FullyQualifiedErrorId : System.IO.FileLoadException,Microsoft.PowerShell.Commands.AddTypeCommand
Add-Type : Не удалось загрузить файл или сборку 'file://\\fs\PowerShellModules\NTFSSecurity\ProcessPrivileges.dll' или одну из её зависимостей. Операция не поддерживается. (Исключение из HRESULT: 0x80131515)
На \\fs\PowerShellModules\NTFSSecurity\NTFSSecurity.Init.ps1:143 символ:1
+ Add-Type -Path $PSScriptRoot\ProcessPrivileges.dll
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Add-Type], FileLoadException
+ FullyQualifiedErrorId : System.IO.FileLoadException,Microsoft.PowerShell.Commands.AddTypeCommand
Типы добавлены
Модуль NTFSSecurity загружен
Import-Module : Не удается найти тип [Security2.IdentityReference2]: убедитесь, что сборка, содержащая этот тип, загружена.
На строке:1 символ:1
+ Import-Module NTFSSecurity
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (Security2.IdentityReference2:TypeName) [Import-Module], RuntimeExcept
ion
+ FullyQualifiedErrorId : TypeNotFound,Microsoft.PowerShell.Commands.ImportModuleCommand
Я использую Windows Management Foundation 3.0 Beta, которая включает PowerShell 3.0. У меня есть подозрение, что новые меры безопасности, введенные в .NET 4.0, играют в этом свою роль, но запуск Powershell.exe
с параметром -version 2.0
также не решает проблему. Я модифицировал свои файлы powershell.exe.config в папках system32 и SysWOW64 следующим образом.
<?xml version="1.0"?>
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0.30319"/>
<supportedRuntime version="v2.0.50727"/>
</startup>
<runtime>
<loadfromremotesources enabled="true"/>
</runtime>
</configuration>
Файлы не “заблокированы”, я проверил каждый из них по отдельности (а также выполнил Unblock-File
для директории). Права доступа на стороне сервера в порядке, я подтвердил, что имею доступ ко всему. Что я ещё не проверил?
Возможно, файл поврежден или был загружен неправильно.
Я получал ту же ошибку, пытаясь загрузить модуль из одного из моих скриптов. Я снова загрузил новую версию 2.3 и разархивировал её в свою папку модулей PowerShell (C:\windows\system32\WindowsPowershell\v1.0\Modules\NTFSSecurity).
Это решило мою проблему.
Вместо того чтобы загружать модуль непосредственно из общей папки, я предпочитаю использовать функцию, которая копирует его локально (это можно настроить для поиска более новых версий). Думаю, это можно написать встроенным способом, но я сделал это функцией как часть моих ‘общих модулей’, которые я загружаю.
Function Import-NTFSModule {
$NTModule="C:\Windows\System32\WindowsPowershell\v1.0\Modules\NTFSSecurity"
$NTSource="\\servername.fqdn\sharename\Modules\NTFSSecurity"
If (!(Get-Module -Name NTFSSecurity)) {
If (!(Test-Path -Path $NTModule) -and (Test-Path $NTSource)) { Copy-Item $NTSource -Destination "$NTModule\" -Recurse -Force }
}
}
По умолчанию файл .ZIP, который вы загружаете, заблокирован от выполнения. Щелкните правой кнопкой мыши по нему и выберите “Разблокировать” перед тем, как распаковывать, и файлы внутри тоже будут разблокированы.
Извините, что когда я изначально писал, я не увидел, что вы говорили, что разблокировали его. Я только получал ошибку (идентичный код ошибки), пока файлы были в заблокированном состоянии.
Запустите Import-Module NTFSSecurity из Windows Powershell (не из ISE)
Ответ или решение
Импорт модуля NTFSSecurity из UNC-пути может вызывать проблемы по нескольким причинам. Сообщение об ошибке, которое вы получили, указывает на то, что .NET не может загрузить указанные DLL-файлы, так как они считаются сенситивными для безопасного выполнения. Это часто связано с мерами безопасности, введенными в .NET Framework.
Вот несколько шагов, которые вы можете предпринять для решения этой проблемы:
-
Проверка блокировки файлов:
Убедитесь, что файлы DLL не заблокированы. Даже если вы проверили это, рекомендуем повторно убедиться в этом:- Щелкните правой кнопкой мыши на каждом файле DLL, выберите «Свойства» и, если есть кнопка «Разблокировать», нажмите ее.
-
Вы также можете использовать команду
Unblock-File
для этой цели, но убедитесь, что вы применяете её к каждому отдельному файлу:Unblock-File -Path \\fs\PowerShellModules\NTFSSecurity\Security2.dll Unblock-File -Path \\fs\PowerShellModules\NTFSSecurity\PrivilegeControl.dll Unblock-File -Path \\fs\PowerShellModules\NTFSSecurity\ProcessPrivileges.dll
-
Локальная копия модуля:
Вместо импорта модуля напрямую из UNC-пути, загрузите его локально. Это может снизить вероятность возникновения подобных проблем. Вы можете написать функцию, которая будет копировать модуль на локальный диск, если он еще не установлен:Function Import-NTFSModule { $NTModule="C:\Windows\System32\WindowsPowershell\v1.0\Modules\NTFSSecurity" $NTSource="\\servername.fqdn\sharename\Modules\NTFSSecurity" If (!(Get-Module -Name NTFSSecurity)) { If (!(Test-Path -Path $NTModule) -and (Test-Path $NTSource)) { Copy-Item $NTSource -Destination "$NTModule\" -Recurse -Force } } Import-Module NTFSSecurity }
После этого выполните
Import-NTFSModule
, чтобы импортировать модуль. -
Версия PowerShell:
Попробуйте запускать PowerShell, а не ISE, так как иногда ISE может вести себя иначе. Убедитесь, что вы запускаете Windows PowerShell, а не Windows PowerShell ISE. -
Использование конфигурационных файлов:
Проверьте конфигурационные файлыpowershell.exe.config
, которые вы изменяли. Убедитесь, что изменения применены правильно и что параметрыloadFromRemotesources
включены (у вас они уже указаны правильно). -
Обновление или повторное скачивание модуля:
Если все вышеперечисленное не помогло, возможно, в модуле есть необходимость в обновлении. Попробуйте скачать последнюю версию NTFSSecurity и убедитесь, что установка прошла успешно. После загрузки повторите процесс разблокировки и затем попробуйте снова.
Следуя этим шагам, вы должны быть в состоянии устранить возникшую проблему с импортом модуля NTFSSecurity из UNC-пути. Если же проблема сохраняется, возможно, потребуется дополнительное исследование для выявления специфичных для вашей системы ошибок.