0

我在我们的一个环境中加载自定义 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 帖子。所以如果我错过了什么,我会提前道歉。

4

1 回答 1

2

您的目标是 .NET 4.x,但 PowerShell v2 默认在 .NET 2.0(最高 3.5)上运行。也许应用程序配置技巧没有像宣传的那样工作?虽然这在您的系统上是一件好事,但我会犹豫是否将 Powershell.exe 的应用程序配置文件添加到其他人的机器上。如果您要达到目标,为什么不直接针对 .NET 2.0 进行编译?如果您需要 .NET 4.0,则要求用户至少拥有 PowerShell v3。

于 2013-06-28T01:11:31.053 回答