{
參考了以文章,感謝文章作者。
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;
補充資訊:
1 網上搜的系統版本號
{
4.0 win95 4.10 win98 4.90 win_me 3.51 win_Nt_3_5 5.0 win2000 5.1 win_xp 5.2 win2003 6.0 vista 6.1 win7 6.2 win8
}
2 服務執行緒中切換
if GetWindowsVersion<6.0 then
WinExec('c:\windows\system32\notepad.exe', SW_SHOWNORMAL)
else
RunAppTest;
3 Service 的 Interactive屬性 置為 true (win2003下需要)
昨晚在網上沒搜到現成的代碼,只好花了點時間自己來轉為D的代碼,希望對需要的人有所幫助以節省時間。
uj5u.com熱心網友回復:
在win7作業系統下,按你的方法沒有試驗成功uj5u.com熱心網友回復:
在win7作業系統下無效。uj5u.com熱心網友回復:
請將winexec改為ShellExecute(需參考ShellAPI單元),再加上service的Interactive屬性 置為 true ,基本上沒有問題了,而且你還可以給你自己的service程式加上托盤圖示之類的都可以,如果Interactive不為true則加托盤圖示不行的。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/60251.html
上一篇:高難道演算法,把html里的table匯出道excel,要支持快行快列
下一篇:遠程桌面不能拷貝檔案的問題
