2015-10-09 5 views
0

Мы пытаемся внедрить MSMQ в наших приложениях, и перед нами стоит следующая проблема: наше приложение (консольное приложение) запускается под учетной записью пользователя локальной машины (machine1) в домене X.Чтение сообщений из очереди с удаленного компьютера

В этом же домене есть еще одна машина (machine2), и на этом компьютере находится очередь. В домене X есть учетная запись пользователя с правами администратора, и этот пользователь имеет полный контроль над очередью, но когда наше приложение запускается, поскольку оно выполняется под локальной учетной записью, у него нет прав на чтение сообщений.

Есть ли решение о том, как исправить эту проблему только из кода? Мы не можем изменить учетную запись пользователя, используемую нашим консольным приложением. Я думаю использовать последнее воплощение в качестве олицетворения.

У вас есть решение проблемы?

ответ

0

как частные, так и публичные очереди позволит вам сделать это: https://technet.microsoft.com/en-us/library/cc772532.aspx

Посмотрите раздел под публичных и частных очередей.

Публичные очереди должны быть доступны для любой учетной записи домена, включая учетные записи компьютеров.

Частные очереди позволяют любому писать, но для этого требуется специальное разрешение.

+0

Привет, Бен, я прочитал эту статью и здесь говорится, что я должен предоставить разрешения «Получить сообщение» моему пользователю. Но проблема в том, что мой пользователь не является пользователем домена, это локальный пользователь и этот пользователь из machine1, и он не отображается на машине2, чтобы добавить этого пользователя на вкладку безопасности очереди. –

0

Я мог читать сообщения только путем выдачи себя. Вот мой код:

чужого имени контекста обертка:

public class WrapperImpersonationContext 
    { 
     [DllImport("advapi32.dll", SetLastError = true)] 
     public static extern bool LogonUser(String lpszUsername, String lpszDomain, 
     String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken); 

     [DllImport("kernel32.dll", CharSet = CharSet.Auto)] 
     public extern static bool CloseHandle(IntPtr handle); 

     private const int LOGON32_PROVIDER_DEFAULT = 0; 
     private const int LOGON32_LOGON_INTERACTIVE = 2; 

     private string m_Domain; 
     private string m_Password; 
     private string m_Username; 
     private IntPtr m_Token; 

     private WindowsImpersonationContext m_Context = null; 


     protected bool IsInContext 
     { 
      get { return m_Context != null; } 
     } 

     public WrapperImpersonationContext(string domain, string username, string password) 
     { 
      m_Domain = domain; 
      m_Username = username; 
      m_Password = password; 
     } 

     [PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")] 
     public void Enter(out string result) 
     { 
      if (this.IsInContext) 
      { 
       result = "not in context"; 
       return; 
      } 
      m_Token = new IntPtr(0); 
      try 
      { 
       m_Token = IntPtr.Zero; 
       bool logonSuccessfull = LogonUser(
        m_Username, 
        m_Domain, 
        m_Password, 
        LOGON32_LOGON_INTERACTIVE, 
        LOGON32_PROVIDER_DEFAULT, 
        ref m_Token); 
       if (logonSuccessfull == false) 
       { 
        result = "logon failed"; 
        int error = Marshal.GetLastWin32Error(); 
        throw new Win32Exception(error); 
       } 
       else 
       { 
        result = "logon succseeded"; 
       } 
       WindowsIdentity identity = new WindowsIdentity(m_Token); 
       m_Context = identity.Impersonate(); 
      } 
      catch (Exception exception) 
      { 
       result = "exception: " + exception.Message; 
       // Catch exceptions here 
      } 
     } 


     [PermissionSetAttribute(SecurityAction.Demand, Name = "FullTrust")] 
     public void Leave() 
     { 
      if (this.IsInContext == false) return; 
      m_Context.Undo(); 

      if (m_Token != IntPtr.Zero) CloseHandle(m_Token); 
      m_Context = null; 
     } 
    } 

Чтение сообщений:

MessageQueue queue = new MessageQueue(@"FormatName:DIRECT=OS:servername\PRIVATE$\queue_name"); 
WrapperImpersonationContext context = new WrapperImpersonationContext("domain", "username", "password"); 
context.Enter(out result); 
Message msg = queue.Receive(); 
context.Leave(); 
0

Если вы не можете выдавать себя за действительный счет домена, вы должны выделить «анонимный вход в систему 'специальные разрешения учетной записи в очереди. Специальная группа «каждый» не будет работать, так как она охватывает только аккаунты, признанные доменом. Учетные записи, локальные на вашем компьютере, являются чужими для домена и не включены.

+0

Привет, Джон из-за проблем с безопасностью «анонимный вход» для нас не является опцией, поэтому команда безопасности создала пользователя домена, который имел права только на очередь, и мы использовали олицетворение для чтения сообщений. –

Смежные вопросы