.NET 4.x Запуск приложения с правами админа из под службы - C#
Формулировка задачи:
public static bool StartProcessAndBypassUAC(String applicationName, out PROCESS_INFORMATION procInfo) { uint winlogonPid = 0; IntPtr hUserTokenDup = IntPtr.Zero, hPToken = IntPtr.Zero, hProcess = IntPtr.Zero; procInfo = new PROCESS_INFORMATION(); uint dwSessionId = WTSGetActiveConsoleSessionId(); Process[] processes = Process.GetProcessesByName("winlogon"); foreach (Process p in processes) { if ((uint)p.SessionId == dwSessionId) { winlogonPid = (uint)p.Id; } } hProcess = OpenProcess(MAXIMUM_ALLOWED, false, winlogonPid); if (!OpenProcessToken(hProcess, TOKEN_DUPLICATE, ref hPToken)) { CloseHandle(hProcess); return false; } SECURITY_ATTRIBUTES sa = new SECURITY_ATTRIBUTES(); sa.Length = Marshal.SizeOf(sa); if (!DuplicateTokenEx(hPToken, MAXIMUM_ALLOWED, ref sa, (int)SECURITY_IMPERSONATION_LEVEL.SecurityIdentification, (int)TOKEN_TYPE.TokenPrimary, ref hUserTokenDup)) { CloseHandle(hProcess); CloseHandle(hPToken); return false; } ................... }
public struct _TOKEN_LINKED_TOKEN { public IntPtr LinkedToken; } [DllImport("advapi32.dll", SetLastError = true)] static extern bool GetTokenInformation( IntPtr TokenHandle, TOKEN_INFORMATION_CLASS TokenInformationClass, IntPtr TokenInformation, uint TokenInformationLength, out uint ReturnLength); public static bool StartProcessAndBypassUAC(String applicationName, out PROCESS_INFORMATION procInfo) { ...... //Продолжение IntPtr newToken = IntPtr.Zero; uint size = 0; var first = GetTokenInformation(hPToken, TOKEN_INFORMATION_CLASS.TokenLinkedToken, IntPtr.Zero, 0, out size); IntPtr linkedTokenStructPtr = Marshal.AllocHGlobal((int)size); var second = GetTokenInformation(hPToken, TOKEN_INFORMATION_CLASS.TokenLinkedToken, linkedTokenStructPtr, size, out size); var linkedTokenStruct = (_TOKEN_LINKED_TOKEN)Marshal.PtrToStructure(linkedTokenStructPtr, typeof(_TOKEN_LINKED_TOKEN)); var linkedToken = linkedTokenStruct.LinkedToken; ..... }
Решение задачи: «.NET 4.x Запуск приложения с правами админа из под службы»
textual
Листинг программы
Marshal.GetExceptionForHR(Marshal.GetHRForLastWin32Error());
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д