NTSERVER中调用SHELLAPI大多会失败,请问是怎么回事?

AppFirst 2003-09-11 04:00:11
NTSERVER中调用SHELLAPI大多会失败,请问是怎么回事?
请大家探讨!!!
...全文
36 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
AppFirst 2003-09-13
  • 打赏
  • 举报
回复
to:tonylk(tony)
帮忙找一找,我急需!!先谢了!:)
AppFirst 2003-09-13
  • 打赏
  • 举报
回复
散分
AppFirst 2003-09-13
  • 打赏
  • 举报
回复
不用了我已搞定!
AppFirst 2003-09-12
  • 打赏
  • 举报
回复
比如你在服务线程中SHOWWINDOW。
tonylk 2003-09-12
  • 打赏
  • 举报
回复
用createprocess可以定义创建的进程用什么用户的身份来运行的,具体参数忘了,但是必须知道这个有效用户的用户名和密码,当然如果用户激活了guest帐号,那么就可以用这个。
AppFirst 2003-09-12
  • 打赏
  • 举报
回复
to:tonylk(tony)
谢谢,不过你知道如何在NTSERVICE中创建进程,但同时不让创建的进程继承NTSERVICE的安全属性,比如可以在任务管理器中关闭创建的进程。
tonylk 2003-09-12
  • 打赏
  • 举报
回复
你是指在service中showwindow吗?那需要取得当前的workstation和desktop后才可以用。
可以参考msdn,这里还有一段别人的程序:
unit ServiceDesktop;

interface

function InitServiceDesktop: boolean;
procedure DoneServiceDeskTop;

{$INCLUDE Config.inc}

implementation

uses
Windows, SysUtils, Common;

const
DefaultWindowStation = 'WinSta0';
DefaultDesktop = 'Default';
var
hwinstaSave: HWINSTA;
hdeskSave: HDESK;
hwinstaUser: HWINSTA;
hdeskUser: HDESK;

function InitServiceDesktop: boolean;
var
dwThreadId: DWORD;
begin
{$IFDEF DEBUG}CreateLog('InitServiceDesktop');{$ENDIF}
dwThreadId := GetCurrentThreadID;
// Ensure connection to service window station and desktop, and
// save their handles.
hwinstaSave := GetProcessWindowStation;
hdeskSave := GetThreadDesktop(dwThreadId);


hwinstaUser := OpenWindowStation(DefaultWindowStation, FALSE, MAXIMUM_ALLOWED);
if hwinstaUser = 0 then
begin
{$IFDEF DEBUG}CreateLog('OpenWindowStation failed' + SysErrorMessage(GetLastError)){$ENDIF};
Result := false;
exit;
end;

if not SetProcessWindowStation(hwinstaUser) then
begin
{$IFDEF DEBUG}CreateLog('SetProcessWindowStation failed'){$ENDIF};
Result := false;
exit;
end;

hdeskUser := OpenDesktop(DefaultDesktop, 0, FALSE, MAXIMUM_ALLOWED);
if hdeskUser = 0 then
begin
{$IFDEF DEBUG}CreateLog('OpenDesktop failed'){$ENDIF};
SetProcessWindowStation(hwinstaSave);
CloseWindowStation(hwinstaUser);
Result := false;
exit;
end;
Result := SetThreadDesktop(hdeskUser);
if not Result then
{$IFDEF DEBUG}CreateLog('SetThreadDesktop' + SysErrorMessage(GetLastError)){$ENDIF};
end;

procedure DoneServiceDeskTop;
begin
{$IFDEF DEBUG}CreateLog('DoneServiceDesktop');{$ENDIF}
// Restore window station and desktop.
SetThreadDesktop(hdeskSave);
SetProcessWindowStation(hwinstaSave);
if hwinstaUser <> 0 then
CloseWindowStation(hwinstaUser);
if hdeskUser <> 0 then
CloseDesktop(hdeskUser);
end;

initialization
InitServiceDesktop;

finalization
DoneServiceDesktop;
end.
fisheryj 2003-09-11
  • 打赏
  • 举报
回复
不会吧
是不是
单元没包含进去
hkbarton 2003-09-11
  • 打赏
  • 举报
回复
好象不上大多数都失败啊
上海老李 2003-09-11
  • 打赏
  • 举报
回复
不会吧,有的是要些权限,大部分是可以的呀

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧