2

私が開発しているアプリケーションの一部として、Microsoft メッセージ キュー機能を利用しようとしていますが、アクセス許可の設定に問題があります。

サーバー コンピューターでキューを作成してメッセージを送信し、クライアント コンピューターからローカル ネットワーク経由でキューにアクセスしたいと考えています。両方のコンピューター (両方の Windows 7 Home Premium) が同じ LAN ネットワーク上にあり、互いに ping を実行できます。作成されたキューの正確なパスがわかるので、プライベート キューは問題ないと思います。

この例に基づいてコードを作成し、 IronPython を使用して System.Messaging 名前空間からMessageQueue クラスにアクセスします。サンプルの送信と受信のセットアップは、キューを作成し、1 つのコンソールでメッセージを送信するように機能します。

>>> localQueue = MessageQueue.Create('.\\private$\\testQueue')
>>> localQueue.FormatName
'DIRECT=OS:<clientMachineName>\\private$\\testQueue'
>>> localQueue.Send('hello from other console')

次に、キューにアクセスし、次のコードを使用して別のコンソールでピークを確認します。

>>> SemiRemoteQueue = MessageQueue('FormatName:Direct=OS:<clientMachineName>\\private$\\testQueue')
>>> SemiRemoteQueue.Peek()
<System.Messaging.Message object at 0x000000000000002F [System.Messaging.Message
]>

サーバー コンピューターに新しいキューを作成すると、クライアント コンピューターからの接続を確立できるように見えますが、クライアント コンピューターからメッセージ データを取得できません。サーバーで作成されたキューをクライアントからピークすると、次の「アクセスが拒否されました」というエラー メッセージが表示されます。

>>> ReallyRemoteQueue = MessageQueue('FormatName:Direct=OS:<serverMachineName>\\private$\\remoteTestQueue')
>>> ReallyRemoteQueue.Peek()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
EnvironmentError: System.Messaging.MessageQueueException (0x80004005): Access to
 Message Queuing system is denied.
   at System.Messaging.MessageQueue.MQCacheableInfo.get_ReadHandle()
   at System.Messaging.MessageQueue.StaleSafeReceiveMessage(UInt32 timeout, Int3
2 action, MQPROPS properties, NativeOverlapped* overlapped, ReceiveCallback rece
iveCallback, CursorHandle cursorHandle, IntPtr transaction)
   at System.Messaging.MessageQueue.ReceiveCurrent(TimeSpan timeout, Int32 actio
n, CursorHandle cursor, MessagePropertyFilter filter, MessageQueueTransaction in
ternalTransaction, MessageQueueTransactionType transactionType)
   at System.Messaging.MessageQueue.Peek()
   at Microsoft.Scripting.Interpreter.FuncCallInstruction`2.Run(InterpretedFrame
 frame)
   at Microsoft.Scripting.Interpreter.Interpreter.Run(InterpretedFrame frame)
   at Microsoft.Scripting.Interpreter.LightLambda.Run3[T0,T1,T2,TRet](T0 arg0, T
1 arg1, T2 arg2)
   at IronPython.Compiler.Ast.CallExpression.Invoke0Instruction.Run(InterpretedF
rame frame)
   at Microsoft.Scripting.Interpreter.Interpreter.Run(InterpretedFrame frame)
   at Microsoft.Scripting.Interpreter.LightLambda.Run2[T0,T1,TRet](T0 arg0, T1 a
rg1)
   at IronPython.Compiler.PythonScriptCode.RunWorker(CodeContext ctx)
   at IronPython.Compiler.PythonScriptCode.Run(Scope scope)
   at IronPython.Hosting.PythonCommandLine.<>c__DisplayClass1.<RunOneInteraction
>b__0()

リモートのプライベート MSMQ キューへのアクセスは可能であることがわかりましたが、適切なアクセス許可を設定する方法がわかりません。ファイアウォール設定で MSMQ を許可し、ファイアウォールをオフにしてみました。アクセス許可設定をキュー ファイルに適用することについての議論を見つけましたが、セキュリティ設定が機能するキュー ファイルがないため、これは役に立ちません。提案されているように、「匿名ログオン」へのフルアクセスを許可するオプションを試したことはありませんが、最終的には、ファイルのコンテキストメニューではなく、プログラムで (コードで) アクセス許可を設定したいと考えています。MessageQueing クラス (http://msdn.microsoft.com/en-us/library/dd48yz36(v=vs.80)) で SetPermissions メソッドを使用する必要がありますか? パラメータを指定するにはどうすればよいですか?

ご提案ありがとうございます。

4

2 に答える 2

3

localQueue.SetPermissions("Everyone", MessageQueueAccessRights.FullControl, AccessControlEntryType.Allow);

"Everyone" は、"Domain\MyUserName" などの任意のドメイン アカウントにすることができます。

于 2013-09-19T04:40:13.070 に答える
1

最初に、'Anonymous Logon' にキューからメッセージを受信する権限を与える必要があります。

ここで見つけたアクセス許可を設定するために、この(C#)コードを使用します:

AccessControlList acl = new AccessControlList();
Trustee owner = new Trustee(WindowsIdentity.GetCurrent().Name, Environment.MachineName, TrusteeType.User);
MessageQueueAccessControlEntry aceOwner = new MessageQueueAccessControlEntry(owner, MessageQueueAccessRights.FullControl);
acl.Add(aceOwner);
messageQueue.SetPermissions(acl);
于 2012-06-19T09:16:26.160 に答える