public void CanSetAndGetMutexSecurity () { if (PlatformID.Win32NT != Environment.OSVersion.Platform) { Assert.Ignore (); return; } MutexAccessRule rule; SecurityIdentifier sid; AuthorizationRuleCollection rulesA, rulesB, rulesC; bool createdNew; MutexSecurity security; string name = @"Local\MonoTestMutex"; using (Mutex mutex = new Mutex(false, name, out createdNew)) { Assert.IsTrue (createdNew); security = mutex.GetAccessControl (); rulesA = security.GetAccessRules (true, false, typeof (SecurityIdentifier)); Assert.AreNotEqual (0, rulesA.Count); // Contrary to what you'd expect, these classes only try to persist sections that // that were *changed*. Awful, eh? To be fair, if you retrieve and modify it's fine. security = new MutexSecurity (); mutex.SetAccessControl (security); security = mutex.GetAccessControl (); rulesB = security.GetAccessRules (true, false, typeof (SecurityIdentifier)); Assert.AreEqual (rulesA.Count, rulesB.Count); // And here's our dummy change. Observe... sid = new SecurityIdentifier( "S-1-5-12-3456-7890"); rule = new MutexAccessRule (sid, MutexRights.Synchronize, AccessControlType.Allow); security = new MutexSecurity (); security.RemoveAccessRuleSpecific (rule); mutex.SetAccessControl (security); security = mutex.GetAccessControl (); rulesC = security.GetAccessRules (true, false, typeof (SecurityIdentifier)); Assert.AreEqual (0, rulesC.Count); } }