2012-05-03 17 views
6

Sto tentando di creare diversi diversi Message Queues su un server Windows 2003x64/2008R2. Quando viene creata una coda, Windows applica automaticamente le autorizzazioni predefinite alla coda.Impostare le autorizzazioni predefinite durante la creazione di una nuova coda messaggi (MSMQ) in C#

per MSMQ 4, i seguenti utenti sono aggiunti di default

  • Ognuno
  • Creatore della coda
  • login anonimo

Quando ho impostato le autorizzazioni per una coda utilizzando MessageQueue.SetPermissions() , lo AccessControlList specificato viene aggiunto solo alle autorizzazioni di sicurezza predefinite.

È possibile che le autorizzazioni predefinite possano essere rimosse o sovrascritte? Nel this MSDN Article in fondo, essa afferma che

non si può, però, personalizzare le impostazioni di default in quanto sono hard-coded.

So che le impostazioni di una coda sono mantenute in un file, situato in C:\Windows\System32\msmq\storage\lqs. In questo file c'è una proprietà Security che rappresenta le autorizzazioni per la coda. Potrebbe essere utile modificare questa chiave? Fare questo, tuttavia, mi sembra strano.

Sto cercando un modo corretto per specificare il proprio AccessControlList che sovrascrive le autorizzazioni di sicurezza predefinite di una coda. O quando viene creato o dopo.

Qualsiasi aiuto è gradito,

Grazie.

risposta

12

Se non è possibile rimuovere o revocare le autorizzazioni a tali gruppi predefiniti, è sempre possibile provare a negare loro i diritti. Nega ha la precedenza su consentire. Questo codice funziona:

MessageQueue queue = new MessageQueue(".\\Private$\\QueueName"); 
queue.SetPermissions("Everyone", MessageQueueAccessRights.ReceiveMessage, 
     AccessControlEntryType.Deny); 

Revoca delle autorizzazioni (AccessControlEntryType.Revoke) dovrebbero anche lavorare però. Forse c'è un errore nel tuo codice. Funziona sulla mia macchina.

L'articolo dice:

non si può, però, personalizzare le impostazioni di default in quanto sono hard-coded.

e significa che non è possibile modificare quali diritti vengono forniti durante la creazione della coda ma è possibile modificarli in seguito.

Modifica: Per ottenere "Everyone" indipendente dal sistema operativo in lingua: How to get the IdentityReference for "Everyone" to create MutexAccessRule on localized systems?

+1

Ma dal momento che 'Deny's la precedenza, e tu sei' Deny'ing tutti questo diritto, non vuol dire che nessuno può usare la coda? Revocare sarebbe un'opzione migliore? –

+0

Revoke è meglio se funziona, ma tu hai scritto che non puoi farlo. Funziona quando ci provo. Riprova con questo codice. –

+0

Sì "Revoca" funziona. Tuttavia, come posso revocare le autorizzazioni per il proprietario/creatore? Questo nome utente non è sempre lo stesso. – Dominik

6

Ho avuto lo stesso problema esattamente con l'ACL. Quando sono passato al metodo SetPermissions() le cose andavano molto meglio.

Il seguente codice funziona per me:

   queue.SetPermissions(
        "Everyone", 
        MessageQueueAccessRights.FullControl, 
        AccessControlEntryType.Allow); 
       queue.SetPermissions(
        "ANONYMOUS LOGON", 
        MessageQueueAccessRights.FullControl, 
        AccessControlEntryType.Allow); 
0

Anche se la risposta di Mike è corretta, si presuppone che il server ha l'inglese come lingua. Se si utilizza questo codice su un server che utilizza un linguaggio diverso (in questo caso olandese) ...

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

... si ottiene la seguente eccezione:

Kan de Naam Tutti niet omzetten (fout = 1332). System.Messaging.AccessControlList.MakeAcl (IntPtr oldAcl) bij System.Messaging.MessageQueue.SetPermissions (AccessControlList DACL) bij System.Messaging.MessageQueue.SetPermissions (utente String, diritti MessageQueueAccessRights, AccessControlEntryType EntryType)

che si traduce approssimativamente in "Impossibile convertire il nome" Everyone ". Invece, se si utilizza questo codice si otterrà una versione localizzata di 'Everyone':

using System.Security.Principal; 

** code ommitted** 

string everyone = new SecurityIdentifier(WellKnownSidType.WorldSid, null).Translate(typeof(NTAccount)).Value; 
queue.SetPermissions( 
        everyone, 
        MessageQueueAccessRights.FullControl, 
        AccessControlEntryType.Allow); 
Problemi correlati