/// <summary> /// Restore the previous privilege state /// </summary> /// <param name="privilegeName"></param> /// <param name="previousPrivilegeState"></param> /// <returns></returns> internal static bool RestoreTokenPrivilege(string privilegeName, ref TOKEN_PRIVILEGE previousPrivilegeState) { // The privilege was not changed, do not need to restore it. if (previousPrivilegeState.PrivilegeCount == 0) { return(true); } bool success = false; TOKEN_PRIVILEGE newState = new TOKEN_PRIVILEGE(); // Check if the caller has the specified privilege or not. If the caller has it, check the LUID specified in previousPrivilegeState // to see if the previousPrivilegeState is defined for the same privilege if (LookupPrivilegeValue(null, privilegeName, ref newState.Privilege.Luid) && newState.Privilege.Luid.HighPart == previousPrivilegeState.Privilege.Luid.HighPart && newState.Privilege.Luid.LowPart == previousPrivilegeState.Privilege.Luid.LowPart) { // Get the pseudo handler of the current process IntPtr processHandler = GetCurrentProcess(); if (processHandler != IntPtr.Zero) { // Get the handler of the current process's access token IntPtr tokenHandler = IntPtr.Zero; if (OpenProcessToken(processHandler, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, out tokenHandler)) { int bufferSize = ClrFacade.SizeOf <TOKEN_PRIVILEGE>(); int returnSize = 0; // restore the privilege state back to the previous privilege state if (AdjustTokenPrivileges(tokenHandler, false, ref previousPrivilegeState, bufferSize, out newState, ref returnSize)) { if (Marshal.GetLastWin32Error() == ERROR_SUCCESS) { success = true; } } } if (tokenHandler != IntPtr.Zero) { CloseHandle(tokenHandler); } CloseHandle(processHandler); } } return(success); }
FileAttributes dwFileAttributes); // _In_ DWORD /// <summary> /// Enable the privilege specified by the privilegeName. If the specified privilege is already enabled, return true /// with the oldPrivilegeState.PrivilegeCount set to 0. Otherwise, enable the specified privilege, and the old privilege /// state will be saved in oldPrivilegeState. /// </summary> /// <param name="privilegeName"></param> /// <param name="oldPrivilegeState"></param> /// <returns></returns> internal static bool EnableTokenPrivilege(string privilegeName, ref TOKEN_PRIVILEGE oldPrivilegeState) { bool success = false; TOKEN_PRIVILEGE newPrivilegeState = new TOKEN_PRIVILEGE(); // Check if the caller has the specified privilege or not if (LookupPrivilegeValue(null, privilegeName, ref newPrivilegeState.Privilege.Luid)) { // Get the pseudo handler of the current process IntPtr processHandler = GetCurrentProcess(); if (processHandler != IntPtr.Zero) { // Get the handler of the current process's access token IntPtr tokenHandler = IntPtr.Zero; if (OpenProcessToken(processHandler, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, out tokenHandler)) { // Check if the specified privilege is already enabled PRIVILEGE_SET requiredPrivilege = new PRIVILEGE_SET(); requiredPrivilege.Privilege.Luid = newPrivilegeState.Privilege.Luid; requiredPrivilege.PrivilegeCount = 1; // PRIVILEGE_SET_ALL_NECESSARY is defined as 1 requiredPrivilege.Control = 1; bool privilegeEnabled = false; if (PrivilegeCheck(tokenHandler, ref requiredPrivilege, out privilegeEnabled) && privilegeEnabled) { // The specified privilege is already enabled oldPrivilegeState.PrivilegeCount = 0; success = true; } else { // The specified privilege is not enabled yet. Enable it. newPrivilegeState.PrivilegeCount = 1; newPrivilegeState.Privilege.Attributes = SE_PRIVILEGE_ENABLED; int bufferSize = ClrFacade.SizeOf <TOKEN_PRIVILEGE>(); int returnSize = 0; // enable the specified privilege if (AdjustTokenPrivileges(tokenHandler, false, ref newPrivilegeState, bufferSize, out oldPrivilegeState, ref returnSize)) { // AdjustTokenPrivileges returns true does not mean all specified privileges have been successfully enabled int retCode = Marshal.GetLastWin32Error(); if (retCode == ERROR_SUCCESS) { success = true; } else if (retCode == 1300) { // 1300 - Not all privileges referenced are assigned to the caller. This means the specified privilege is not // assigned to the current user. For example, suppose the role of current caller is "User", then privilege "SeRemoteShutdownPrivilege" // is not assigned to the role. In this case, we just return true and leave the call to "Win32Shutdown" to decide // whether the permission is granted or not. // Set oldPrivilegeState.PrivilegeCount to 0 to avoid the privilege restore later (PrivilegeCount - how many privileges are modified) oldPrivilegeState.PrivilegeCount = 0; success = true; } } } } // Close the token handler and the process handler if (tokenHandler != IntPtr.Zero) { CloseHandle(tokenHandler); } CloseHandle(processHandler); } } return(success); }
/// <summary> /// Gets Method Signature from FuncDesc describing the method. /// </summary> /// <param name="typeinfo">ITypeInfo interface of the object</param> /// <param name="funcdesc">FuncDesc which defines the method</param> /// <param name="isPropertyPut">True if this is a property put; these properties take their return type from their first paramenter</param> /// <returns>signature of the method</returns> internal static string GetMethodSignatureFromFuncDesc(COM.ITypeInfo typeinfo, COM.FUNCDESC funcdesc, bool isPropertyPut) { StringBuilder builder = new StringBuilder(); string name = GetNameFromFuncDesc(typeinfo, funcdesc); if (!isPropertyPut) { //First get the string for return type. string retstring = GetStringFromTypeDesc(typeinfo, funcdesc.elemdescFunc.tdesc); builder.Append(retstring + " "); } //Append the function name builder.Append(name); builder.Append(" ("); IntPtr ElementDescriptionArrayPtr = funcdesc.lprgelemdescParam; int ElementDescriptionSize = ClrFacade.SizeOf <COM.ELEMDESC>(); for (int i = 0; i < funcdesc.cParams; i++) { COM.ELEMDESC ElementDescription; int ElementDescriptionArrayByteOffset; IntPtr ElementDescriptionPointer; ElementDescription = new COM.ELEMDESC(); ElementDescriptionArrayByteOffset = i * ElementDescriptionSize; //Disable PRefast warning for converting to int32 and converting back into intptr. //Code below takes into account 32 bit vs 64 bit conversions #pragma warning disable 56515 if (IntPtr.Size == 4) { ElementDescriptionPointer = (IntPtr)(ElementDescriptionArrayPtr.ToInt32() + ElementDescriptionArrayByteOffset); } else { ElementDescriptionPointer = (IntPtr)(ElementDescriptionArrayPtr.ToInt64() + ElementDescriptionArrayByteOffset); } #pragma warning restore 56515 ElementDescription = ClrFacade.PtrToStructure <COM.ELEMDESC>(ElementDescriptionPointer); string paramstring = GetStringFromTypeDesc(typeinfo, ElementDescription.tdesc); if (i == 0 && isPropertyPut) // use the type of the first argument as the return type { builder.Insert(0, paramstring + " "); } else { builder.Append(paramstring); if (i < funcdesc.cParams - 1) { builder.Append(", "); } } } builder.Append(")"); return(builder.ToString()); }