Powershell Импорт пользовательских C # CMDlets, нет доступных "ExportedCommands" - PullRequest
3 голосов
/ 22 июня 2011

первый вопрос здесь:)

Итак, я должен создать собственный CMDLet для Powershell 2.0, используя Visual Studio 2010 Express.Я следовал этому, казалось бы, простому руководству: 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_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);
    }

Может быть грубая ошибка, я просто не вижу этого

Ответы [ 5 ]

1 голос
/ 03 декабря 2011

Это связано с Code Access Security в .NET. По умолчанию сборка , загруженная из сетевого ресурса, выполняется с ограниченными привилегиями, тогда как сборка * 1003 из локального хранилища вообще не имеет ограничений. К сожалению, командлет Import-Module не указывает на то, что ему не удалось импортировать командлеты в модуле, даже если он вызывается с параметром -Verbose.

Чтобы изменить набор разрешений, предоставленных определенному сетевому расположению, используйте утилиту 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"
1 голос
/ 29 августа 2011

Если вы работаете с этим по сети или unc-пути, вы должны добавить путь к своим .net-трастам:

то есть:

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

НТН,

Bob

1 голос
/ 22 июня 2011

Не знаю, если репост, но:

Я нашел решение.Скопировал мою dll из сетевого пути UNC в локальный c: \, и теперь появляется команда.

1 голос
/ 22 июня 2011

Две вещи выскакивают @ me:

  1. TicketID - это поле, а не свойство.
  2. Атрибут overnamedspaced делает код трудным для чтения.

Я подозреваю, что это # ​​1, но я не вижу достаточно прошлого # 2, чтобы быть уверенным.

Надеюсь, это поможет

0 голосов
/ 22 июня 2011

Я в основном скопировал вставленный твой код. Я сделал 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);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...