.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());