2011-06-29 25 views
3

C#でInternet Explorerブラウザヘルパーオブジェクト(BHO)を開発しています。このBHOは、ユーザーがナビゲートするURLを検出し、ユーザー名とパスワードを自動的に入力します。C#:名前付きパイプの整合性が低い

BHOは、サービスとして実行中のプロセスと通信します。通信は名前付きパイプで行われます。

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

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

これについて読んだところ、IEが で実行されているためにパイプのアクセスが拒否されていることがわかりました。

私は次の記事を読んでいます。 a。保護モードでの理解と作業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); 

私が行方不明です何かがあります:

次は、パイプに

サービス側のコードを開く前にセキュリティコンテキストを設定するための私のソースコードはありますか?

ありがとうございました。

+0

保護モードをいくつかのポインタを与える可能性* *意味するものではありません:「管理者権限を停止すべきで実行されるサービスのコードを実行するために、名前付きパイプを使用するすべてのコードを、除い鉱山"。 "except mine"句はありません。誰もが当然のことだと思うでしょうが、その機能は役に立たなくなります。これは明らかです。 –

+0

現在のユーザーをPipeAccessRuleに追加する理由は何ですか?作成者は既にパイプの最初の所有者としてデフォルトでフルコントロールを持っています。 –

+0

おかげでハンス、私はあなたのコメントを理解していませんでした。あなたのコメントにもっと詳しく教えてください。 AFAIK私はそれを仮定していません。 –

答えて

3

あなたは、VistaのWindowsに追加された完全性レベルのメカニズムに惑わされているようです。このメカニズムは、アクセス制御リストの許可エントリと拒否エントリに基づくアクセス制御メカニズムと直交しています。

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

my blog for a description of how I solved a similar issuealternative url)を参照してください:それはあなたの

+0

Windows 7 SP1で動作します。ありがとう! –

関連する問題