我在我们的一个环境中加载自定义 PowerShell 命令行开关时遇到问题。现在,我知道在我的本地环境中,我可以很好地加载和执行命令行开关。我已经搜索了几个小时,但一无所获——所以如果有人回答了这个问题,我深表歉意,但我还没有找到答案。情况:
1) 我在 .NET 中编写了一个 PowerShell commandlet,派生自 System.Management.Automation.Cmdlet 类。我最初的目标是 .NET 4.5,但现在我的目标是 .NET 4.0。我将继续描述的一切都在这两个目标下进行了尝试。
2) 运行命令“Import-Module -Verbose -Name C:\path\to\commandlet.dll”会在本地(它工作的地方)产生以下输出: VERBOSE: Loading module from path 'C:....\ myDLL.dll' VERBOSE:导入 cmdlet 'Read-Version' 与 'faulty' 环境中的输出':VERBOSE:从路径 'C:....\myDLL.dll' 加载模块
它显然没有导入我的“Read-Version”cmdlet。
3) 我添加了 'powershell.exe.config' 和 'powershell_ise.exe.config' 文件,内容如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!-- http://msdn.microsoft.com/en-us/library/w4atty68.aspx -->
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0.30319" />
<supportedRuntime version="v3.5" />
<supportedRuntime version="v3.0" />
<supportedRuntime version="v2.0.50727" />
</startup>
</configuration>
到以下目录:C:\Windows\System32\WindowsPowerShell\v1.0 和 C:\Windows\SysWOW64\WindowsPowerShell\v1.0
4) 我意识到以下内容的安全隐患,但继续通过以下 PowerShell 函数禁用了强命名程序集的验证:
Function DisableStrongSignValidation
{
reg DELETE "HKLM\Software\Microsoft\StrongName\Verification" /f
reg ADD "HKLM\Software\Microsoft\StrongName\Verification\*,*" /f
if ($env:PROCESSOR_ARCHITECTURE -eq "AMD64")
{
reg DELETE "HKLM\Software\Wow6432Node\Microsoft\StrongName\Verification" /f
reg ADD "HKLM\Software\Wow6432Node\Microsoft\StrongName\Verification\*,*" /f
}
Restart-Service msiserver
}
我验证了,注册表项已创建。
5) 我通过验证“myDLL.dll”和他的所有依赖项都具有 FullTrust 来验证代码访问安全不是问题。
6) 我尝试通过以管理员身份显式启动 PowerShell 进程来加载程序集,包括 x64 和 x86 变体。
7) 从我的工作环境中复制整个 C:\Windows\SysWOW64\WindowsPowerShell\v1.0(甚至 C:\Windows\System32\WindowsPowerShell\v1.0)并启动该 powershell.exe 实例导致没有行为的改变。
希望这清楚地说明了迄今为止的情况。回顾一下,这次失败只是一种环境,就我的一生而言,我无法弄清楚它与我当地的环境有何不同。显然有什么,但是什么?完全缺乏来自 PowerShell 的附加信息(即使是“详细”)非常令人沮丧。为了重申我的问题的开头,我确实做了很多搜索(在这里和其他地方)——步骤(5)中的 CAS 解决方案甚至来自 StackOverflow 帖子。所以如果我错过了什么,我会提前道歉。