Windowsサービスで使用するプライベートメッセージキューを作成しようとしています。私は私のサービスのProjectInstaller
クラスでキューを作成しています。言っクラスのコンストラクタでは、私はMessageQueueInstaller
オブジェクトを作成し、そのように私の地元のInstaller.Installers
プロパティに追加します。MessageQueueInstallerを使用してMSMQメッセージキューのアクセス許可を設定できません
var path = _config?.Settings[QUEUE_PATH]?.Value;
if (string.IsNullOrEmpty(path))
{
Console.WriteLine($"Could not install MSMQ message queue. Cannot install service. Missing private queue path value.");
throw new ArgumentNullException(QUEUE_PATH, "Cannot create private message queue with null queue path.");
}
_q = new MessageQueueInstaller();
_q.Label = "Queue Name";
_q.Path = path;
_q.Transactional = true;
Installers.Add(_q);
私は資格情報はサービスがインストールされているときに渡されることを期待する、と私はアカウントをしたいので、サービスが作成されているメッセージキューへのフルアクセスを持っているの下で実行され、私はそうのようなユーザー名をつかむために、私のServiceProcessInstaller
のAfterInstall
イベントに加入しています:
_serviceProcessInstaller.AfterInstall += (sender, args) =>
{
_q.Permissions = new AccessControlList()
{
new AccessControlEntry(new Trustee(_serviceProcessInstaller.Username, null, TrusteeType.User),
GenericAccessRights.All, StandardAccessRights.All, AccessControlEntryType.Allow)
};
};
このプロセスが正常に完了し、ACLエントリが私のプライベートキューのセキュリティタブに期待値と一緒に追加されるMSMQと対話する必要がサービスを実行するときに、しかし、私は次のエラーが表示さ:私は手動でキューのセキュリティ]タブからまったく同じACLエントリを作成する場合は、奇妙なことに
Access to Message Queuing system is denied
を、すべてが魔法のように動作します!
私はプログラム的にすべてのACLを作成する場合にも、(上記のエラーで終わる)、およびその後セット手動でフルコントロールに「みんな、それも動作しますが、同じ時にフルコントロールに「みんな」を設定します実際の口座を設定しているところではではありません。
最後に、NT AUTHORITY \ Network Serviceの下でMSMQサービスを実行しています。私はもは、すべてのパーマが設定されているように見えるが、同じエラーが依然として受信されているように見える)、そのアカウントをプログラムで追加しようとしましたが、MSMQサービスをローカルシステムとして使用しても役に立たない。
私は正直なところ、これをどうしたらいいのか分かりません。私が知る限り、アクセス権は、プログラム的にまたは手動で追加されたかどうかにかかわらず同一ですが、明らかにそれは実際には真ではないか、これはうまくいくでしょう。
私はここで何が欠けていますか?
追加の状況が必要な場合は教えてください。ありがとう!
ああよくこれは動作します。 'MessageQueueInstaller'で動作するように見える理由を知りたいのですが、実際にはそうではありませんが、少なくともこれでこの問題が解決されます。ありがとう! –