110,536
社区成员
发帖
与我相关
我的任务
分享
[DllImport("User32.dll", CharSet = CharSet.Auto)]
private static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID);
[DllImport("advapi32.dll", SetLastError = true)]
private static extern bool OpenProcessToken(IntPtr ProcessHandle, uint DesiredAccess, out IntPtr TokenHandle);
[DllImport("advapi32.dll", SetLastError = true, CharSet = System.Runtime.InteropServices.CharSet.Auto)]
private static extern bool LookupPrivilegeValue(string lpSystemName, string lpName, out long lpLuid);
[DllImport("advapi32.dll", SetLastError = true)]
private static extern bool AdjustTokenPrivileges(IntPtr TokenHandle, bool DisableAllPrivileges, ref TOKEN_PRIVILEGES NewState, int BufferLength, IntPtr PreviousState, IntPtr ReturnLength);
[StructLayout(LayoutKind.Sequential, Pack = 1)]
private struct TOKEN_PRIVILEGES
{
public int PrivilegeCount;
public long Luid;
public int Attributes;
}
//adjust process privileges
public int AdjustToken()
{
const uint TOKEN_ADJUST_PRIVILEGES = 0x20;
const uint TOKEN_QUERY = 0x8;
const int SE_PRIVILEGE_ENABLED = 0x2;
const int SE_PRIVILEGE_REMOVED = 0x4;
const string SE_SHUTDOWN_NAME = "SeShutdownPrivilege";
const string SE_DEBUG_NAME = "SeDebugPrivilege";
IntPtr procHandle = new IntPtr(xlApp.Hwnd);
int pId = 0;
GetWindowThreadProcessId(procHandle, out pId);
//get token
IntPtr tokenHandle;
OpenProcessToken(procHandle, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, out tokenHandle);
//get luid
TOKEN_PRIVILEGES tp = new TOKEN_PRIVILEGES();
tp.Attributes = SE_PRIVILEGE_ENABLED | SE_PRIVILEGE_REMOVED;
tp.PrivilegeCount = 1;
LookupPrivilegeValue(null, SE_DEBUG_NAME, out tp.Luid);
//adjust privileges
AdjustTokenPrivileges(tokenHandle, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero);
return pId;
}
public void Release()
{
xlSheet = null;
xlBook.Close(true,false,Nothing);
xlApp.Quit();
KillExcelProcess2();
}
//note
public void KillExcelProcess2()
{
Process[] procList = Process.GetProcesses();
String pName;
int pId = AdjustToken();
foreach (Process proc in procList)
{
pName = proc.ProcessName;
if (pId == proc.Id)
proc.Kill();
}
}