4

C# で Internet Explorer ブラウザー ヘルパー オブジェクト (BHO) を開発しています。この BHO は、ユーザーが移動する URL を検出し、ユーザー名とパスワードを自動入力します。

BHO は、サービスとして実行されているプロセスと通信します。通信は名前付きパイプを介して行われます。

プロテクトモードがオフの場合、通信は正常に機能します。ただし、保護モードがオンの場合、これは機能しません。管理者として iexplore.exe を実行すると、動作します。

保護モードでは、アクセス拒否メッセージが表示されます。

これについて読んだ後、IE が整合性の低いスコープで実行されているため、パイプ アクセスが拒否されていることに気付きました。

次の記事を読みました。保護モード Internet Explorer の理解と使用 http://msdn.microsoft.com/en-us/library/bb250462.aspx

b.また、パイプ リソースを作成する前にセキュリティ情報を設定して、整合性の低いプロセスがこれを使用できるようにするための多くの提案を行いました。しかし、これらは私にはあまり役に立ちませんでした。それでも同じエラーが発生します。

私が現在持っている唯一の回避策は、ソケットを介して通信することです。このアプローチが機能することを確認しました。

名前付きパイプのアプローチを使用したいと思います。

以下は、パイプを開く前にセキュリティ コンテキストを設定するためのソース コードです。

サービス側コード:

PipeSecurity security = new PipeSecurity();
security.AddAccessRule(new PipeAccessRule(
new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null),  // @"Users"
            PipeAccessRights.ReadWrite, 
            System.Security.AccessControl.AccessControlType.Allow
            ));

var currentUser = WindowsIdentity.GetCurrent().Name;
security.AddAccessRule(new PipeAccessRule(currentUser, PipeAccessRights.FullControl,   System.Security.AccessControl.AccessControlType.Allow));


NamedPipeServerStream stream;
stream = new NamedPipeServerStream(
            CommandPipeName,
            PipeDirection.InOut, MAX_PIPE_INSTANCE,
            PipeTransmissionMode.Message, PipeOptions.WriteThrough,
            EPHelperCommandPipeServerConsts.MaxPipeRequestLength,
            EPHelperCommandPipeServerConsts.MaxPipeResponseLength,
            security
            );

do
        {
            n++;

            isListening = true;
            stream.WaitForConnection();
            isListening = false;

            var cs = stream;

            stream = new NamedPipeServerStream(
                    CommandPipeName,
                    PipeDirection.InOut, MAX_PIPE_INSTANCE,
                    PipeTransmissionMode.Message, PipeOptions.WriteThrough,
                    EPHelperCommandPipeServerConsts.MaxPipeRequestLength,
                    EPHelperCommandPipeServerConsts.MaxPipeResponseLength,
                    security
                    );

    // some code

        } while (true);

私が見逃しているものはありますか?

ありがとう。

4

1 に答える 1

4

Vista で Windows に追加された Integrity Level メカニズムに違反していると思います。このメカニズムは、アクセス制御リストの許可および拒否エントリに基づくアクセス制御メカニズムと直交しています。

パイプの整合性レベルを下げるという考えは正しいアプローチだと思いますが、あなたのコードはこれをまったく行っていません。リソースに関連付けられた整合性ラベルを変更するための .NET Framework クラスはまだサポートされていません。Win32 API を使用する必要があります。

同様の問題をどのように解決したかについては、私のブログを参照してください(代替 URL ): ヒントが得られる場合があります。

于 2011-07-28T23:17:41.460 に答える