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);
私が見逃しているものはありますか?
ありがとう。