1

Microsoft Virtual Server 2005 R2 SP1と対話するためのいくつかのNAntタスクを作成しようとしていますが、「PowerShellによる仮想サーバーの制御」の投稿の「VirtualPCGuyのWebLog」にあるコードを削除しました。

動作しません:CreateVirtualMachineを呼び出すと、常に失敗します。

System.Runtime.InteropServices.COMException (0x80070542): Either a required impersonation level was not provided, or the provided impersonation level is invalid. (Exception from HRESULT: 0x80070542)

at Microsoft.VirtualServer.Interop.VMVirtualServerClass.CreateVirtualMachine(String configurationName, String configurationPath)

私のコードは次のとおりです。

var virtualServer = new VMVirtualServerClass();
SetSecurity(virtualServer);
var virtualMachine = virtualServer.CreateVirtualMachine("TEST",
    @"D:\Virtual Server\TEST.vmc");

...ここで、SetSecurityは次のように定義されています。

    private static void SetSecurity(object dcomObject)
    {
        IntPtr pProxy = Marshal.GetIUnknownForObject(dcomObject);
        int hr = CoSetProxyBlanket(pProxy,
            RPC_C_AUTHN_DEFAULT,
            RPC_C_AUTHZ_DEFAULT,
            IntPtr.Zero,
            RPC_C_AUTHN_LEVEL_PKT_PRIVACY,
            RPC_C_IMP_LEVEL_IMPERSONATE,
            IntPtr.Zero,
            EOAC_DYNAMIC_CLOAKING);
        Marshal.ThrowExceptionForHR(hr);
    }

    private const uint RPC_C_AUTHN_NONE = 0;
    private const uint RPC_C_AUTHN_WINNT = 10;
    private const uint RPC_C_AUTHN_DEFAULT = 0xFFFFFFFF;

    private const uint RPC_C_AUTHZ_NONE = 0;
    private const uint RPC_C_AUTHZ_DEFAULT = 0xFFFFFFFF;

    private const uint RPC_C_AUTHN_LEVEL_DEFAULT = 0;
    private const uint RPC_C_AUTHN_LEVEL_PKT_PRIVACY = 6;

    private const uint RPC_C_IMP_LEVEL_IDENTIFY = 2;
    private const uint RPC_C_IMP_LEVEL_IMPERSONATE = 3;

    private const uint EOAC_NONE = 0;
    private const uint EOAC_DYNAMIC_CLOAKING = 0x40;
    private const uint EOAC_DEFAULT = 0x0800;

    [DllImport("Ole32.dll")]
    public static extern int CoSetProxyBlanket(IntPtr pProxy,
            UInt32 dwAuthnSvc,
            UInt32 dwAuthzSvc,
            IntPtr pServerPrincName,
            UInt32 dwAuthnLevel,
            UInt32 dwImpLevel,
            IntPtr pAuthInfo,
            UInt32 dwCapabilities);

スタンドアロンプ​​ログラムを作成してに呼び出しを追加するとCoInitializeSecurity、それは機能します。CoInitializeSecurityただし、スタンドアロンプ​​ログラムは必要ありません。一連のNAntタスク(つまりDLL)が必要であり、他のNAntタスクが呼び出さないことを保証する方法がないため、呼び出したくありません。すでにそれ。

誰かがこれを機能させましたか?

4

2 に答える 2

1

価値のあることとして、.NET 4.0は、GetObjectForIUnknownWithBlanketこの問題に対処するのに役立つ新しいメソッド(System.Runtime.InteropServices.Marshalの下)を追加するようです。(ベータ)MSDNの記事から:

GetObjectForIUnknownWithBlanketは、IUnknownを一意の管理対象オブジェクトにラップし、要求されたすべてのインターフェイスでCoSetProxyBlanket関数を呼び出します。これにより、指定されたIUnknownを既存のオブジェクトと照合するためにキャッシュを検索する代わりに、一意のオブジェクトが返されるようになります。

まだ試していませんが、有望そうです。

ちなみに、素晴らしい質問と素晴らしい受け入れられた答え!私はちょうど同じ問題に遭遇しました、そしてこれは私が適切な説明を見つけた唯一の場所でした。

于 2009-08-23T21:14:35.443 に答える
1

マネージコードからCoSetProxyBlanketを使用することに関して、根本的な問題が発生している可能性があります。残念ながら、CLRがインターフェイスをマーシャリングする方法が原因で、マネージコードでこのメソッドと相互運用するための信頼できる方法はありません。

この問題を説明するブログエントリがいくつかあります

于 2008-11-30T07:49:57.063 に答える