win2000或是winNT环境中,delphi如何修改系统时间?(200分)

  • 主题发起人 主题发起人 hzfgh
  • 开始时间 开始时间
H

hzfgh

Unregistered / Unconfirmed
GUEST, unregistred user!
我在WIN2000下,用SETLOCALTIME不能设置系统时间。<br>API帮助提示要用AdjustTokenPrivileges函数,得到修改的特权。<br>可是这个函数在编译是不能通过。<br>请问是否有其他更简单的方法,或是解决这个函数的问题。<br>只要OK,我可以另给分数的。
 
参照一下这个帖子,也是要设置Privileges的,<br>http://www.delphibbs.com/delphibbs/dispq.asp?lid=565798<br>把原来程序中的 SeShutdownPrivilege 换成 SeSystemTimePrivilege 就行了<br>不过我没有试验,你试一下吧,理论上应该可以的。
 
我修改了下列代码,系统用administrator权限登陆没有问题,但是用user权限登陆出现<br>1300错误。<br>代码如下:<br>procedure TForm1.modifysystime(Newtime: Tsystemtime);<br>const<br>&nbsp; SE_SHUTDOWN_NAME = 'SeSystemTimePrivilege'; // Borland forgot this declaration<br>var<br>&nbsp; hToken : THandle;<br>&nbsp; tkp : TTokenPrivileges;<br>&nbsp; tkpo : TTokenPrivileges;<br>&nbsp; zero : DWORD;<br>&nbsp; errId:integer;<br>begin<br>&nbsp; zero:=0;<br>&nbsp; {if not OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then begin<br>&nbsp; &nbsp; MessageBox( 0, 'Exit Error', 'OpenProcessToken() Failed', MB_OK );<br>&nbsp; &nbsp; Exit;<br>&nbsp; end;} // if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)<br>&nbsp; if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then<br>&nbsp; begin<br>&nbsp; &nbsp; MessageBox( 0, 'Exit Error', 'OpenProcessToken() Failed', MB_OK );<br>&nbsp; &nbsp; Exit;<br>&nbsp; end; // if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)<br><br>// SE_SHUTDOWN_NAME<br>&nbsp; if not LookupPrivilegeValue( nil, 'SeSystemTimePrivilege' , tkp.Privileges[ 0 ].Luid ) then<br>&nbsp; begin<br>&nbsp; &nbsp; &nbsp; MessageBox( 0, 'Exit Error', 'LookupPrivilegeValue() Failed', MB_OK );<br>&nbsp; &nbsp; &nbsp; Exit;<br>&nbsp; end; // if not LookupPrivilegeValue( nil, 'SeShutdownPrivilege' , tkp.Privileges[0].Luid )<br>&nbsp; tkp.PrivilegeCount := 1;<br>&nbsp; tkp.Privileges[ 0 ].Attributes := SE_PRIVILEGE_ENABLED;<br>&nbsp; AdjustTokenPrivileges(hToken, False,tkp , SizeOf(tkp), tkpo, zero );<br>&nbsp; if Boolean( GetLastError() ) then begin<br>&nbsp; &nbsp; &nbsp; errId:=GetLastError();<br>&nbsp; &nbsp; &nbsp; showMessage('AdjustTokenPrivileges ErrorId:'+inttostr(errId));<br>&nbsp; &nbsp; &nbsp; Exit;<br>&nbsp; end // if Boolean( GetLastError() )<br>&nbsp; //else ExitWindowsEx( EWX_FORCE or EWX_SHUTDOWN, EWX_POWEROFF);<br>&nbsp; else<br>&nbsp; begin<br>&nbsp; &nbsp; if not setlocaltime(Newtime) then<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; errId:=GetLastError();<br>&nbsp; &nbsp; &nbsp; showMessage('setlocaltime ErrorId:'+inttostr(errId));<br>&nbsp; &nbsp; end;<br>&nbsp; end;<br>&nbsp; AdjustTokenPrivileges( hToken, true,tkpo, SizeOf(TTokenPrivileges), tkp, zero );<br>end;
 
权限不够,要能修改Privilege首先需要SeChangeNotifyPrivilege权限<br>这个权限在admin登陆下是默认打开的,但user好像没有这个权限
 
楼上说的没错,权限问题
 
在administrator下使用delphi的api函数 SetSystemTime<br><br>
 
对啊,就是用这个函数没有问题的。主要出在权限上。<br>我们在临沂用的GPS系统,就是这么写的。
 
后退
顶部