3

这里的第一个问题:)

所以我必须使用 Visual Studio 2010 Express 为 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

我的代码几乎相同(甚至尝试复制粘贴他们的代码)但是在我调用Import-Module "path_to_dll"之后

然后调用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);
    }

可能是个错误,我只是看不到它

4

5 回答 5

1

不知道是否转发,但是:

我找到了解决方案。将我的 dll 从 UNC 网络路径复制到本地 c:\ 现在命令出现了。

于 2011-06-22T07:53:01.943 回答
1

如果您在网络或 unc path 之外运行它,则必须将路径添加到您的 .net 信任:

IE:

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

高温下,

鲍勃

于 2011-08-29T19:55:54.803 回答
1

@我有两件事跳出来:

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

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

希望这可以帮助

于 2011-06-22T07:20:04.150 回答
1

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

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

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

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

caspol.exe -machine -listgroups

请注意,在 32 位 Windowscaspol.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"
于 2011-12-03T01:53:35.940 回答
0

我基本上复制了粘贴的代码。我做了一个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);
        }
    }
}
于 2011-06-22T12:22:27.763 回答