private void InitMutex() { Assembly newAss = Assembly.GetExecutingAssembly(); string appGuid = ((GuidAttribute)Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(GuidAttribute), false).GetValue(0)).Value.ToString(); string mutexId = $"Global\\{{{appGuid}}}"; _mutex = new Mutex(false, mutexId); MutexAccessRule allowEveryoneRule = new MutexAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), MutexRights.FullControl, AccessControlType.Allow); MutexSecurity securitySettings = new MutexSecurity(); securitySettings.AddAccessRule(allowEveryoneRule); // get user rights if (_mutex.WaitOne(TimeSpan.Zero, true)) { GerLog.PrintInfo("Current access rules:"); foreach (MutexAccessRule accessRule in securitySettings.GetAccessRules(true, true, typeof(NTAccount))) { GerLog.PrintInfo($"User: {accessRule.IdentityReference}"); GerLog.PrintInfo($"Type: {accessRule.AccessControlType}"); GerLog.PrintInfo($"Rights: {accessRule.MutexRights}"); } } _mutex.SetAccessControl(securitySettings); }
private static void ShowSecurity(MutexSecurity security) { Console.WriteLine("\r\nCurrent access rules:\r\n"); foreach (MutexAccessRule ar in security.GetAccessRules(true, true, typeof(NTAccount))) { Console.WriteLine(" User: {0}", ar.IdentityReference); Console.WriteLine(" Type: {0}", ar.AccessControlType); Console.WriteLine(" Rights: {0}", ar.MutexRights); Console.WriteLine(); } }
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); } }
private void VerifyMutexSecurity(MutexSecurity expectedSecurity, MutexSecurity actualSecurity) { Assert.Equal(typeof(MutexRights), expectedSecurity.AccessRightType); Assert.Equal(typeof(MutexRights), actualSecurity.AccessRightType); List <MutexAccessRule> expectedAccessRules = expectedSecurity.GetAccessRules(includeExplicit: true, includeInherited: false, typeof(SecurityIdentifier)) .Cast <MutexAccessRule>().ToList(); List <MutexAccessRule> actualAccessRules = actualSecurity.GetAccessRules(includeExplicit: true, includeInherited: false, typeof(SecurityIdentifier)) .Cast <MutexAccessRule>().ToList(); Assert.Equal(expectedAccessRules.Count, actualAccessRules.Count); if (expectedAccessRules.Count > 0) { Assert.All(expectedAccessRules, actualAccessRule => { int count = expectedAccessRules.Count(expectedAccessRule => AreAccessRulesEqual(expectedAccessRule, actualAccessRule)); Assert.True(count > 0); }); } }