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

これは、.NETのコードアクセスセキュリティが原因です。デフォルトでは、ネットワーク共有からロードされたアセンブリは制限された特権で実行されますが、ローカルストレージからロードされたアセンブリには制限がまったくありません。残念ながら、コマンドレットは、パラメーターを指定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_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 に答える
1

2つのことが飛び出します@私:

  1. TicketID はフィールドであり、プロパティではありません。
  2. overnamedspaced 属性により、コードが読みにくくなります。

#1 だと思いますが、確かに #2 を過ぎて十分に見ることができません。

お役に立てれば

于 2011-06-22T07:20:04.150 に答える
1

再投稿するかどうかはわかりませんが、

解決策を見つけました。DLL を UNC ネットワークパスからローカル c:\ にコピーすると、コマンドが表示されます。

于 2011-06-22T07:53:01.943 に答える
0

基本的に、貼り付けたコードをコピーしました。Get-ModuleClassLibrary2を実行しました。また、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 に答える