public Privilege(string privilegeName) { if (privilegeName == null) { throw new ArgumentNullException(nameof(privilegeName)); } this.luid = LuidFromPrivilege(privilegeName); }
// // This routine is a wrapper around a hashtable containing mappings // of privilege names to luids // private static Luid LuidFromPrivilege(string privilege) { Luid luid; luid.LowPart = 0; luid.HighPart = 0; // // Look up the privilege LUID inside the cache // try { privilegeLock.AcquireReaderLock(-1); if (luids.Contains(privilege)) { luid = (Luid)luids[privilege]; privilegeLock.ReleaseReaderLock(); } else { privilegeLock.ReleaseReaderLock(); if (false == NativeMethods.LookupPrivilegeValue(null, privilege, ref luid)) { int error = Marshal.GetLastWin32Error(); if (error == NativeMethods.ERROR_NOT_ENOUGH_MEMORY) { throw new OutOfMemoryException(); } else if (error == NativeMethods.ERROR_ACCESS_DENIED) { throw new UnauthorizedAccessException("Caller does not have the rights to look up privilege local unique identifier"); } else if (error == NativeMethods.ERROR_NO_SUCH_PRIVILEGE) { throw new ArgumentException( string.Format("{0} is not a valid privilege name", privilege), nameof(privilege)); } else { throw new Win32Exception(error); } } privilegeLock.AcquireWriterLock(-1); } } finally { if (privilegeLock.IsReaderLockHeld) { privilegeLock.ReleaseReaderLock(); } if (privilegeLock.IsWriterLockHeld) { if (!luids.Contains(privilege)) { luids[privilege] = luid; privileges[luid] = privilege; } privilegeLock.ReleaseWriterLock(); } } return(luid); }