测试代码
procedure TETCServe1.ShowDlg(); //lpszMessage: PChar; lpszTitle: PChar
var
bSuccess: Boolean;
si: STARTUPINFO;
pi: PROCESS_INFORMATION;
dwSessionID: DWORD;
hToken, hDuplicatedToken: THandle;
lpEnvironment: Pointer;
//lpszClientPath: PChar;
begin
bSuccess := FALSE;
// 进程信息
ZeroMemory(@si, sizeof(STARTUPINFO) );
si.cb := sizeof(si);
Si.lpDesktop := PChar('Winsta0\Default'); //--
si.wShowWindow:=SW_SHOWNORMAL; //--
// 获得当前Session ID
dwSessionID := WTSGetActiveConsoleSessionId; //showmessage(SysErrorMessage(GetLastError));
hToken := 0;
// 获得当前Session的用户令牌
if WTSQueryUserToken(dwSessionID,@hToken) = FALSE then begin
showmessage(SysErrorMessage(GetLastError));
if not bSuccess then
// ShowMessage('无法创建复杂UI', '错误');
if hToken <> 0 then
CloseHandle(hToken);
Exit;
end;
// 复制令牌
hDuplicatedToken := 0;
if DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, nil,
SecurityIdentification, TokenPrimary,
hDuplicatedToken) = FALSE then
begin
if not bSuccess then
//ShowMessage('无法创建复杂UI', '错误');
if hToken <> 0 then
CloseHandle(hToken);
if hDuplicatedToken <> 0 then
CloseHandle(hDuplicatedToken);
Exit;
end;
// 创建用户Session环境
lpEnvironment := nil;
if CreateEnvironmentBlock(lpEnvironment, hDuplicatedToken, FALSE) = FALSE then
begin if not bSuccess then
//ShowMessage('无法创建复杂UI', '错误');
if hToken <> 0 then
CloseHandle(hToken);
if hDuplicatedToken <> 0 then
CloseHandle(hDuplicatedToken);
if lpEnvironment <> nil then
DestroyEnvironmentBlock(lpEnvironment);
Exit;
end;
// 在复制的用户Session下执行应用程序,创建进程。
// 通过这个进程,就可以显示各种复杂的用户界面了
if CreateProcessAsUser(hDuplicatedToken,
PChar(cmd), nil, nil, nil, FALSE,
NORMAL_PRIORITY_CLASS,
lpEnvironment, nil, si, pi) = FALSE then
begin
if not bSuccess then
//ShowMessage('无法创建复杂UI', '错误');
if hToken <> 0 then
CloseHandle(hToken);
if hDuplicatedToken <> 0 then
CloseHandle(hDuplicatedToken);
if lpEnvironment <> nil then
DestroyEnvironmentBlock(lpEnvironment);
Exit;
end;
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
bSuccess:=TRUE;
end;在调试代码时,获取session当前用户令牌,总是返回false,dwSessionID 的值是有值的,GetLastError后总是提示“客户端没有所需的权限”,关掉UAC,还是报同样消息;请求大家帮忙解决,在此拜谢!!!
procedure TETCServe1.ShowDlg(); //lpszMessage: PChar; lpszTitle: PChar
var
bSuccess: Boolean;
si: STARTUPINFO;
pi: PROCESS_INFORMATION;
dwSessionID: DWORD;
hToken, hDuplicatedToken: THandle;
lpEnvironment: Pointer;
//lpszClientPath: PChar;
begin
bSuccess := FALSE;
// 进程信息
ZeroMemory(@si, sizeof(STARTUPINFO) );
si.cb := sizeof(si);
Si.lpDesktop := PChar('Winsta0\Default'); //--
si.wShowWindow:=SW_SHOWNORMAL; //--
// 获得当前Session ID
dwSessionID := WTSGetActiveConsoleSessionId; //showmessage(SysErrorMessage(GetLastError));
hToken := 0;
// 获得当前Session的用户令牌
if WTSQueryUserToken(dwSessionID,@hToken) = FALSE then begin
showmessage(SysErrorMessage(GetLastError));
if not bSuccess then
// ShowMessage('无法创建复杂UI', '错误');
if hToken <> 0 then
CloseHandle(hToken);
Exit;
end;
// 复制令牌
hDuplicatedToken := 0;
if DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, nil,
SecurityIdentification, TokenPrimary,
hDuplicatedToken) = FALSE then
begin
if not bSuccess then
//ShowMessage('无法创建复杂UI', '错误');
if hToken <> 0 then
CloseHandle(hToken);
if hDuplicatedToken <> 0 then
CloseHandle(hDuplicatedToken);
Exit;
end;
// 创建用户Session环境
lpEnvironment := nil;
if CreateEnvironmentBlock(lpEnvironment, hDuplicatedToken, FALSE) = FALSE then
begin if not bSuccess then
//ShowMessage('无法创建复杂UI', '错误');
if hToken <> 0 then
CloseHandle(hToken);
if hDuplicatedToken <> 0 then
CloseHandle(hDuplicatedToken);
if lpEnvironment <> nil then
DestroyEnvironmentBlock(lpEnvironment);
Exit;
end;
// 在复制的用户Session下执行应用程序,创建进程。
// 通过这个进程,就可以显示各种复杂的用户界面了
if CreateProcessAsUser(hDuplicatedToken,
PChar(cmd), nil, nil, nil, FALSE,
NORMAL_PRIORITY_CLASS,
lpEnvironment, nil, si, pi) = FALSE then
begin
if not bSuccess then
//ShowMessage('无法创建复杂UI', '错误');
if hToken <> 0 then
CloseHandle(hToken);
if hDuplicatedToken <> 0 then
CloseHandle(hDuplicatedToken);
if lpEnvironment <> nil then
DestroyEnvironmentBlock(lpEnvironment);
Exit;
end;
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
bSuccess:=TRUE;
end;在调试代码时,获取session当前用户令牌,总是返回false,dwSessionID 的值是有值的,GetLastError后总是提示“客户端没有所需的权限”,关掉UAC,还是报同样消息;请求大家帮忙解决,在此拜谢!!!
解决方案 »
- 用windows API的SendMessage函数发送数据到TDBGrid不成功??
- delphi7 中IF语句没问题却不执行,求指点
- 用Delphi打开Excel并导入到Oracle,如何记录这其中发生的错误、成功的记录呀?急啊
- 如何将一窗体中的dbgrid当前选择的记录传到另外一窗体中?(入门)
- 几个概念(指针,属性……),多指教!
- 请教高手:怎么做一个自定义的打开文件对话框?
- dbgird问题!急!!!!!!!!!!
- 请教:ListView问题?
- 各位看过来,Caption中文乱码
- 关于 软件产品化!
- DataModule中添加了adoconnection、adquery、datasource。窗体dbgrid无法显示!
- 一个多进程浏览器的问题。
PChar(cmd), nil, nil, nil, FALSE,
NORMAL_PRIORITY_CLASS,
lpEnvironment, nil, si, pi) = FALSE then工作需要搜索到了这篇文章,尝试到这句一直没有成功,后来把 NORMAL_PRIORITY_CLASS换成CREATE_UNICODE_ENVIRONMENT标记总算通过,仅供后人尝试回复于此!