2017-07-06 8 views
0

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); 

私は資格情報はサービスがインストールされているときに渡されることを期待する、と私はアカウントをしたいので、サービスが作成されているメッセージキューへのフルアクセスを持っているの下で実行され、私はそうのようなユーザー名をつかむために、私のServiceProcessInstallerAfterInstallイベントに加入しています:

_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サービスをローカルシステムとして使用しても役に立たない。

私は正直なところ、これをどうしたらいいのか分かりません。私が知る限り、アクセス権は、プログラム的にまたは手動で追加されたかどうかにかかわらず同一ですが、明らかにそれは実際には真ではないか、これはうまくいくでしょう。

私はここで何が欠けていますか?

追加の状況が必要な場合は教えてください。ありがとう!

答えて

1

次のコードを使用して、MSMQキューを作成し、アクセス許可を設定しています。それはすべてうまく動作します:

public void CreateQueueIfNotExists(string queueName, List<string> users) 
{ 
    if (!MessageQueue.Exists(queueName)) 
    { 
     MessageQueue.Create(queueName); 
     var queue = new MessageQueue(queueName); 
     //set permissions for those users 
     foreach (var user in users) 
     { 
      queue.SetPermissions(user, MessageQueueAccessRights.ReceiveMessage | MessageQueueAccessRights.WriteMessage, AccessControlEntryType.Allow); 
     } 
    } 
} 
+0

ああよくこれは動作します。 'MessageQueueInstaller'で動作するように見える理由を知りたいのですが、実際にはそうではありませんが、少なくともこれでこの問題が解決されます。ありがとう! –

関連する問題