作为我正在开发的应用程序的一部分,我试图利用Microsoft消息队列功能,并且我在权限设置方面遇到了麻烦。
我想在服务器计算机上创建一个队列并向其发送消息,并通过本地网络从客户端计算机访问它。两台计算机(均为Windows 7 Home Premium)位于同一LAN网络上,并且能够相互ping通。我将知道创建的队列的确切路径,所以我猜私人队列是好的。
我的代码基于this example,并使用IronPython从System.Messaging命名空间访问MessageQueue class。发送&从示例接收设置工作以创建队列并在一个控制台中发送消息:
>>> 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类中使用SetPermissions方法(http://msdn.microsoft.com/en-us/library/dd48yz36(v=vs.80))吗?如何指定其参数?
感谢您的任何建议!
答案 0 :(得分:3)
localQueue.SetPermissions( “所有人”, MessageQueueAccessRights.FullControl,AccessControlEntryType.Allow);
“Everyone”可以是任何域帐户,例如“Domain \ MyUserName”
答案 1 :(得分:1)
在第一个实例中,您需要为“匿名登录”提供从队列接收消息的权限。
我使用此(C#)代码设置我找到here的权限:
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);