Powershell正在导入自定义C#CMDlets,没有可用的“;导出的命令”;

本文关键字:命令 导入 自定义 C#CMDlets Powershell | 更新日期: 2023-09-27 18:00:15

这里的第一个问题:)

因此,我必须使用visualstudio2010express为Powershell 2.0创建一个自定义CMDLet。我遵循了这个看似简单的教程:http://blogs.msdn.com/b/saveenr/archive/2010/03/08/how-to-create-a-powershell-2-0-module-and-cmdlet-with-visual-studio-2010-screencast-included.aspx

我的代码几乎相同(甚至尝试过复制粘贴他们的代码),但在我调用导入模块"path_to_dl"之后

然后调用Get-Module,我看到我导入的模块,但没有ExportedCommands可用

ModuleType Name                      ExportedCommands
---------- ----                      ----------------
Binary     PowerShellCMDLetsLibrary  {}

C#代码:

namespace PowerShellCMDLetsLibrary
{
    [System.Management.Automation.Cmdlet(System.Management.Automation.VerbsCommon.Get,"RemedyXml")]
    public class Get_RemedyXml:System.Management.Automation.PSCmdlet
    {
    [System.Management.Automation.Parameter(Position = 0, Mandatory = true)]
    public string TicketID;
    protected override void ProcessRecord()
    {
    ...
    this.WriteObject(Result.InnerXml, true);
    }

可能是个错误,我就是看不到

Powershell正在导入自定义C#CMDlets,没有可用的“;导出的命令”;

有两件事跳出@me:

  1. TicketID是一个字段,而不是属性
  2. 过度命名的归因使代码难以阅读

我怀疑它是#1,但我看不到足够多的#2来确定。

希望这对有帮助

不知道是否转发,但是:

我找到了解决办法。已将我的dll从UNC网络路径复制到本地c:''现在命令出现了。

如果您在网络或unc路径下运行此程序,则必须将该路径添加到您的.net信任:

即:

caspol -machine -addgroup 1. -url "file:'''network'dir''*" FullTrust  -n Uniquename

HTH,

Bob

这是由于.NET中的代码访问安全性造成的。默认情况下,从网络共享加载的程序集在执行时会降低权限,而从本地存储加载的程序集中则没有任何限制。不幸的是,即使使用-Verbose参数进行调用,Import-Module cmdlet也不会指示它未能导入模块中的cmdlet。

要更改授予特定网络位置的权限集,请使用caspol.exe实用程序为该位置创建一个新的代码组:

caspol.exe -machine -addgroup 1.2 -url "file://server/share/directory/*" FullTrust

上述命令中的1.2是指LocalIntranet代码组,它将是新代码组的父代码组。以下命令将显示定义了哪些代码组,并可用于显示您创建的组:

caspol.exe -machine -listgroups

请注意,在32位Windows上,caspol.exe位于%WinDir%'Microsoft.NET'Framework'CLR_VERSION'中(其中,对于PowerShell 2.0,CLR_VERSIONv2.0.50727),在64位Windows上另一个副本位于%WinDir%'Microsoft.NET'Framework64'CLR_VERSION'中。32位和64位版本都有自己的安全配置文件(CONFIG'security.config),因此您需要确保使用各自的caspol.exe将每个安全更改应用于这两个版本。

以下命令可用于显示将授予特定程序集的权限:

caspol.exe -resolveperm "//server/share/directory/assembly.dll"

我基本上复制并粘贴了您的代码。我做了一个Get Module ClassLibrary2。TicketID也起作用。

ModuleType Name                      ExportedCommands
---------- ----                      ----------------
Binary     ClassLibrary2             Get-RemedyXml

using System.Management.Automation;
namespace ClassLibrary1
{
    [Cmdlet(VerbsCommon.Get, "RemedyXml")]
    public class Class1 : PSCmdlet
    {
        [Parameter(Position = 0, Mandatory = true)] 
        public string TicketID;
        protected override void ProcessRecord()
        {
            WriteObject(TicketID);
        }
    }
}