在windows2008下
用 logonUser 获得Token 然后用这个Token 去 CreateProcessAsUser 现在的问题是 利用logonUser 获得的Token 是在session 0 下面的,不可以和用户交互,需要setTokenInformation 将Token 中的Session ID 改为 1(当前用户Session ID),但这样一来 调用的外部应用程序 无法正常显示。如下图:但如果利用“explorer.exe” 获取Token,此Token的Session ID 不是0(应该是当前用户的 Session),利用这个Token CreateProcessAsUser 就可正常显示 exe程序的界面 如图
我觉得是用LogonUser 获得Token 应该是不完整吧(与“explorer.exe”获得Token相比)
但不知道应该如何修改,还请高人 指点!!
代码如下: IntPtr hToken = IntPtr.Zero;
Boolean result = false;
result = LogonUser(
strName,
strDomain,
strPwd,
LogonType.LOGON32_LOGON_INTERACTIVE,
LogonProvider.LOGON32_PROVIDER_DEFAULT,
out hToken
);
//
IntPtr hDupedToken = IntPtr.Zero; PROCESS_INFORMATION pi = new PROCESS_INFORMATION();
SECURITY_ATTRIBUTES sa = new SECURITY_ATTRIBUTES();
sa.Length = Marshal.SizeOf(sa); STARTUPINFO si = new STARTUPINFO();
si.cb = Marshal.SizeOf(si); int dwSessionID = 1;
result = DuplicateTokenEx(
hToken,
GENERIC_ALL_ACCESS,
ref sa,
(int)SECURITY_IMPERSONATION_LEVEL.SecurityIdentification,
(int)TOKEN_TYPE.TokenPrimary,
ref hDupedToken
); if (!result)
{
ShowMessageBox("DuplicateTokenEx failed", "AlertService Message");
}
result = SetTokenInformation(hDupedToken, TOKEN_INFORMATION_CLASS.TokenSessionId, ref dwSessionID, (UInt32)IntPtr.Size);
if (!result)
{
ShowMessageBox("SetTokenInformation failed", "AlertService Message");
}
IntPtr lpEnvironment = IntPtr.Zero; //
Int32 dwCreationFlags = NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE;
result = CreateEnvironmentBlock(ref lpEnvironment, hDupedToken, true);
if (result)
{
dwCreationFlags |= CREATE_UNICODE_ENVIRONMENT;
} if (!result)
{
ShowMessageBox("CreateEnvironmentBlock failed", "AlertService Message");
}
//
result = CreateProcessAsUser(
hDupedToken,
path + app,
String.Empty,
ref sa, ref sa,
false, dwCreationFlags, lpEnvironment,
path, ref si, ref pi); if (!result)
{
int error = Marshal.GetLastWin32Error();
string message = String.Format("CreateProcessAsUser Error: {0}", error);
message = GetLastErrorMessage(error);
ShowMessageBox(message, "AlertService Message");
}
//string testX = si.lpDesktop;
if (pi.hProcess != IntPtr.Zero)
CloseHandle(pi.hProcess);
if (pi.hThread != IntPtr.Zero)
CloseHandle(pi.hThread);
if (hToken != IntPtr.Zero)
CloseHandle(hToken);
if (hDupedToken != IntPtr.Zero)
CloseHandle(hDupedToken);
}win2008 LogOnUserCreateProcessAsUser
用 logonUser 获得Token 然后用这个Token 去 CreateProcessAsUser 现在的问题是 利用logonUser 获得的Token 是在session 0 下面的,不可以和用户交互,需要setTokenInformation 将Token 中的Session ID 改为 1(当前用户Session ID),但这样一来 调用的外部应用程序 无法正常显示。如下图:但如果利用“explorer.exe” 获取Token,此Token的Session ID 不是0(应该是当前用户的 Session),利用这个Token CreateProcessAsUser 就可正常显示 exe程序的界面 如图
我觉得是用LogonUser 获得Token 应该是不完整吧(与“explorer.exe”获得Token相比)
但不知道应该如何修改,还请高人 指点!!
代码如下: IntPtr hToken = IntPtr.Zero;
Boolean result = false;
result = LogonUser(
strName,
strDomain,
strPwd,
LogonType.LOGON32_LOGON_INTERACTIVE,
LogonProvider.LOGON32_PROVIDER_DEFAULT,
out hToken
);
//
IntPtr hDupedToken = IntPtr.Zero; PROCESS_INFORMATION pi = new PROCESS_INFORMATION();
SECURITY_ATTRIBUTES sa = new SECURITY_ATTRIBUTES();
sa.Length = Marshal.SizeOf(sa); STARTUPINFO si = new STARTUPINFO();
si.cb = Marshal.SizeOf(si); int dwSessionID = 1;
result = DuplicateTokenEx(
hToken,
GENERIC_ALL_ACCESS,
ref sa,
(int)SECURITY_IMPERSONATION_LEVEL.SecurityIdentification,
(int)TOKEN_TYPE.TokenPrimary,
ref hDupedToken
); if (!result)
{
ShowMessageBox("DuplicateTokenEx failed", "AlertService Message");
}
result = SetTokenInformation(hDupedToken, TOKEN_INFORMATION_CLASS.TokenSessionId, ref dwSessionID, (UInt32)IntPtr.Size);
if (!result)
{
ShowMessageBox("SetTokenInformation failed", "AlertService Message");
}
IntPtr lpEnvironment = IntPtr.Zero; //
Int32 dwCreationFlags = NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE;
result = CreateEnvironmentBlock(ref lpEnvironment, hDupedToken, true);
if (result)
{
dwCreationFlags |= CREATE_UNICODE_ENVIRONMENT;
} if (!result)
{
ShowMessageBox("CreateEnvironmentBlock failed", "AlertService Message");
}
//
result = CreateProcessAsUser(
hDupedToken,
path + app,
String.Empty,
ref sa, ref sa,
false, dwCreationFlags, lpEnvironment,
path, ref si, ref pi); if (!result)
{
int error = Marshal.GetLastWin32Error();
string message = String.Format("CreateProcessAsUser Error: {0}", error);
message = GetLastErrorMessage(error);
ShowMessageBox(message, "AlertService Message");
}
//string testX = si.lpDesktop;
if (pi.hProcess != IntPtr.Zero)
CloseHandle(pi.hProcess);
if (pi.hThread != IntPtr.Zero)
CloseHandle(pi.hThread);
if (hToken != IntPtr.Zero)
CloseHandle(hToken);
if (hDupedToken != IntPtr.Zero)
CloseHandle(hDupedToken);
}win2008 LogOnUserCreateProcessAsUser
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货