title: UnauthorizedAccessException when trying to open a mutex
body: <p>I'm getting this exception when trying to open a mutex (it happens only sometimes; the most of calls is successful):</p>
  
  <pre><code>System.UnauthorizedAccessException: Access to the path 'Global\4c7cddf7-e729-43b6-a75c-43f54a0ac6ac' is denied.
     at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
     at System.Threading.Mutex.OpenExisting(String name, MutexRights rights)
  </code></pre>
  
  <p>The code I'm using to work with mutex:</p>
  
  <pre><code>public class MutexLocker : IDisposable
  {
      public MutexLocker(string id)
      {
          var doesNotExist = false;
          var unauthorized = false;
  
          try
          {
              _mutex = Mutex.OpenExisting(id, MutexRights.Synchronize | MutexRights.Modify);
          }
          catch (WaitHandleCannotBeOpenedException)
          {
              doesNotExist = true;
          }
          catch (UnauthorizedAccessException ex)
          {
              unauthorized = true;
          }
  
          if (doesNotExist)
          {
              _mutex = new Mutex(false, id);
  
              var allowEveryoneRule = new MutexAccessRule(
                  new SecurityIdentifier(WellKnownSidType.WorldSid, null), MutexRights.FullControl, AccessControlType.Allow);
              var securitySettings = new MutexSecurity();
              securitySettings.AddAccessRule(allowEveryoneRule);
              _mutex.SetAccessControl(securitySettings);
          }
          else if (unauthorized)
          {
              var tempMutex = Mutex.OpenExisting(id, MutexRights.ReadPermissions | MutexRights.ChangePermissions);
              var securitySettings = tempMutex.GetAccessControl();
  
              var user = Environment.UserDomainName + "\\" + Environment.UserName;
  
              // the rule that denied the current user the right to enter and release the mutex must be removed
              var rule = new MutexAccessRule(user, MutexRights.Synchronize | MutexRights.Modify, AccessControlType.Deny);
              securitySettings.RemoveAccessRule(rule);
  
              // Now grant the correct rights
              var allowEveryoneRule = new MutexAccessRule(
                  new SecurityIdentifier(WellKnownSidType.WorldSid, null), MutexRights.FullControl, AccessControlType.Allow);
              securitySettings.AddAccessRule(allowEveryoneRule);
              tempMutex.SetAccessControl(securitySettings);
  
              _mutex = Mutex.OpenExisting(id, MutexRights.Synchronize | MutexRights.Modify);
          }
  
          var success = _mutex.WaitOne(TimeSpan.FromSeconds(10), false);
          if (success == false)
          {
              _mutex.Dispose();
              _mutex = null;
              throw new ApplicationException(string.Format("Can't lock mutex (timed out): {0}", id));
          }
      }
  
      public void Dispose()
      {
          if (_mutex != null)
          {
              try
              {
                  _mutex.ReleaseMutex();
              }
              catch (Exception exc)
              {
                  Trace.WriteLine(exc);
              }
  
              _mutex.Dispose();
          }
      }
  
      private readonly Mutex _mutex;
  }
  </code></pre>
  
  <p>The mutex "id" is a guid and name conflicts are impossible.<br>
  This is the only code that can create that mutex, and it grants full access to it for all users (my processes can be run under different user credentials). </p>
  
  <p>Any ideas, why this unauthorized access error might happen?</p>