首页
社区
课程
招聘
[求助]怎么获得其他机子的关机权限
发表于: 2006-10-24 12:06 5285

[求助]怎么获得其他机子的关机权限

2006-10-24 12:06
5285
我们一个作业就是做个网吧管理软件
现在要实现远程关机的功能
请文各位大侠
怎么通过管理员的帐户来对同一网段的机子实现远程关机?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 261
活跃值: (162)
能力值: ( LV13,RANK:320 )
在线值:
发帖
回帖
粉丝
2
发个指令让客户端软件调用shutdown.exe -s
2006-10-24 12:38
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢啊 不过我是想不设置客户端程序的
是不是可以用logonuser通过用户名,密码来关?
2006-10-24 16:38
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
LookupPrivilegeValue(hostname,SE_SHUTDOWN_NAME
                    ,&tkp.Privileges[0].Luid);
函数返回值是0,是什么缘故啊?
怎么修改才可以提高权限的?

就是tkp.Privileges[0].Luid得不到值
还是一个随机数

请问有谁知道是为什么吗?
2006-10-24 19:56
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
自己顶一个
期待高手的回答啊
2006-10-26 08:42
0
雪    币: 261
活跃值: (162)
能力值: ( LV13,RANK:320 )
在线值:
发帖
回帖
粉丝
6
//调整关机权限

procedure TForm1.AdjustPrivileges();
var
  hdlProcessHandle : Cardinal;
  hdlTokenHandle : Cardinal;
  tmpLuid : Int64;
  tkpPrivilegeCount : Int64;
  tkp : TOKEN_PRIVILEGES;
  tkpNewButIgnored : TOKEN_PRIVILEGES;
  lBufferNeeded : Cardinal;
  Privilege : array[0..0] of _LUID_AND_ATTRIBUTES;
begin
        hdlProcessHandle := GetCurrentProcess;
        OpenProcessToken(hdlProcessHandle, (TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY),hdlTokenHandle);
        
       // Get the LUID for shutdown privilege.

        LookupPrivilegeValue('', 'SeShutdownPrivilege', tmpLuid);
        Privilege[0].Luid := tmpLuid;
        Privilege[0].Attributes := SE_PRIVILEGE_ENABLED;
        tkp.PrivilegeCount := 1;                      // One privilege to set
        tkp.Privileges[0] := Privilege[0];

        // Enable the shutdown privilege in the access token of this process.

        AdjustTokenPrivileges(hdlTokenHandle, False,tkp,Sizeof(tkpNewButIgnored),tkpNewButIgnored,lBufferNeeded);
end;

//关机

function ShutDownSystem():BOOL;
var
  hProcess,hAccessToken:THandle;
  LUID_AND_ATTRIBUTES:TLUIDAndAttributes;
  TOKEN_PRIVILEGES: TTokenPrivileges;
  BufferIsNull:DWORD;
Const
  SE_SHUTDOWN_NAME='SeShutdownPrivilege';
begin
  hProcess:=GetCurrentProcess();
  OpenProcessToken(hprocess,TOKEN_ADJUST_PRIVILEGES+TOKEN_QUERY,hAccessToken);
  LookupPrivilegeValue(Nil,SE_SHUTDOWN_NAME,LUID_AND_ATTRIBUTES.Luid);
  LUID_AND_ATTRIBUTES.Attributes:=SE_PRIVILEGE_ENABLED;
  TOKEN_PRIVILEGES.PrivilegeCount:=1;
  TOKEN_PRIVILEGES.Privileges[0]:=LUID_AND_ATTRIBUTES;
  BufferIsNull:=0;
  AdjustTokenPrivileges(hAccessToken,False,TOKEN_PRIVILEGES,sizeof(TOKEN_PRIVILEGES),Nil,BufferIsNull);
  ExitWindowsEx(EWX_REBOOT, 0);
  ShutDownSystem:=True;
end;
2006-10-26 09:01
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
仔细看了6楼大哥的代码了
LookupPrivilegeValue(Nil,SE_SHUTDOWN_NAME,LUID_AND_ATTRIBUTES.Luid);
您这个用来获得的是本机的LUID是没问题的
但是我想要的是获得远程主机的LUID
我的代码如下
c=LogonUser("abc","202.203.208.33","123",LOGON32_LOGON_NETWORK,LOGON32_PROVIDER_DEFAULT,&hToken);
c=DuplicateTokenEx(hToken,TOKEN_ALL_ACCESS,NULL,SecurityIdentification,TokenPrimary,&hNewToken);
c=ImpersonateLoggedOnUser(hNewToken);
        if(!OpenThreadToken(GetCurrentThread(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,TRUE,&hNewToken))
                AfxMessageBox(str1);

        c=LookupPrivilegeValue((LPTSTR)(LPCTSTR)hostName,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
我通过LogonUser来传递登录名和密码,但是不知道为什么
c=LookupPrivilegeValue((LPTSTR)(LPCTSTR)hostName,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
返回值c=0,就是说LUID没获得,还是个随机数
我不知道错在哪儿了   再次请教
2006-10-26 09:56
0
游客
登录 | 注册 方可回帖
返回
//