1,183
社区成员




{
参考了以文章,感谢文章作者。
http://www.cnblogs.com/gnielee/archive/2010/04/08/1707169.html
http://www.java123.net/v/324099.html
开始按VC写的,发现有问题,后精简为C#版。
}
{导入的API}
function WTSQueryUserToken(SessionId: DWORD; phToken: PHandle): Boolean; stdcall; external 'wtsapi32.dll';
function CreateEnvironmentBlock(lpEnvironment: PPVOID; hToken: THandle; bInherit: Boolean): Boolean; stdcall; external 'userenv.dll';
{ 判断操作系统 }
function GetWindowsVersion: Double;
var
Info: TOSVersionInfo;
begin
FillChar(Info, sizeof(Info), 0);
Info.dwOSVersionInfoSize := sizeof(OSVERSIONINFO);
GetVersionExW(Info);
Result := StrToFloat(Info.dwMajorVersion.ToString()+'.'+Info.dwMinorVersion.ToString());
end;
{ 主体代码}
function RunAppTest: Boolean;
var
si: TStartupInfo;
pi: TProcessInformation;
hThisToken, hDuplicatedToken: THandle;
SessionID: DWORD;
TokenInfoClass: TTokenInformationClass;
lpEnvironment: LPVOID;
sa: TSecurityAttributes;
begin
ZeroMemory(@si, SizeOf(si));
ZeroMemory(@pi, Sizeof(pi));
si.cb := SizeOf(si);
si.lpDesktop := 'Winsta0\Default';
SessionID := WTSGetActiveConsoleSessionId();
b := WTSQueryUserToken(SessionID, @hThisToken);
Log.Add('WTSQueryUserToken ' + B2S(b));
b := DuplicateTokenEx(hThisToken, MAXIMUM_ALLOWED, @sa, SecurityIdentification, TokenPrimary, hDuplicatedToken);
Log.Add('DuplicateTokenEx ' + B2S(b));
b := CreateEnvironmentBlock(@lpEnvironment, hDuplicatedToken, False);
Log.Add('CreateEnvironmentBlock ' + B2S(b));
b := CreateProcessAsUserW( hDuplicatedToken,
'calc.exe',
nil,
@sa,
nil,
False,
NORMAL_PRIORITY_CLASS or CREATE_NEW_CONSOLE or CREATE_UNICODE_ENVIRONMENT,
lpEnvironment,
'c:\windows\system32',
si,
pi );
Log.Add('CreateProcessAsUserW ' + B2S(b));
{ CloseHandle 代码 略 }
end;