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);
}
可能是个错误,我就是看不到
有两件事跳出@me:
- TicketID是一个字段,而不是属性
- 过度命名的归因使代码难以阅读
我怀疑它是#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_VERSION为v2.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);
}
}
}