其实你的记事本已经打开了,只是你看不见而已,你看下进程里面是不是已经有notepad的进程了,WIN7中因为服务进程是运行在session0下面的~~第一个登录的用户session为1
winexec 和 shellexecute 都不行。都只是在进程里面创建 界面上跳不出来
--------------------------------------------------------------------------------
感谢各位的热心帮助
问题已经解决
一个比较简单的方法:
1.WTSGetActiveConsoleSessionId
2.WTSQueryUserToken
3.CreateProcessAsUser
三步就能实现目标
但是如果第三步使用CreateProcessWithToken创建进程只能改变用户名不能改变session id
那个楼主已经做成功了试试吧,其实关键之处就是得到当前登录用户的Token令牌,然后CreateProcessAsUser用此令牌,创建一个属于此会话下面的进程
--------------------------------------------------------------------------------
谢谢楼上 代码研究出来了。 但是程序总是会在服务桌面里面开起来 不会在当前用户桌面上启动 白搭了。。
有没办法让他弄到当前桌面上来? 请指教
procedure TForm1.Button5Click(Sender: TObject);
var
hToken:thandle;
ph:thandle;
si:STARTUPINFO;
pi:PROCESS_INFORMATION;
begin
ph:=openprocess(PROCESS_ALL_ACCESS ,
false,
GetCurrentProcessID());
if ph<=0 then exit;
openprocesstoken( ph,TOKEN_ALL_ACCESS,hToken); //去当前进程Token等同于取当前帐户Token
try
ZeroMemory( @si, sizeof( STARTUPINFO ) );
si.cb := sizeof( STARTUPINFO );
Si.lpDesktop := PChar('Winsta0Default');
si.wShowWindow:=SW_SHOWNORMAL;
CreateProcessAsUser(hToken,pchar(cmd) , pchar(para), nil,nil,FALSE,
Create_DEFAULT_ERROR_MODE,//NORMAL_PRIORITY_CLASS or Create_NEW_CONSOLE,
nil,nil,si,pi );
finally
closehandle(ph);
end;
end;
http://bbs.csdn.net/topics/390249745