Даже если ты работаешь под Администратором, твоя программка должна запросить дополнительные привилегии. Вот как это делается (на языке Си):
void Reboot (void) { HANDLE hToken; TOKEN_PRIVILEGES* NewState; OSVERSIONINFO OSVersionInfo; OSVersionInfo.dwOSVersionInfoSize = sizeof (OSVERSIONINFO); GetVersionEx (&OSVersionInfo); if (OSVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) { OpenProcessToken (GetCurrentProcess (), TOKEN_ADJUST_PRIVILEGES, &hToken); NewState = (TOKEN_PRIVILEGES*) malloc (sizeof (TOKEN_PRIVILEGES) + sizeof (LUID_AND_ATTRIBUTES)); NewState->PrivilegeCount = 1; LookupPrivilegeValue (NULL, SE_SHUTDOWN_NAME, &NewState->Privileges[0].Luid); NewState->Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges (hToken, FALSE, NewState, NULL, NULL, NULL); free (NewState); CloseHandle (hToken); } ExitWindowsEx (EWX_REBOOT, 0); }
Andy Nikolayev
an@megatel.ru (2:5020/56)Здесь иная редакция этой процедуры (на Паскале, без проверки версии ОС) -
Procedure Shutdown(Name:String; // Имя машины (\\SERVER) Message:String; // Сообщение Delay:Integer; // Задержка перед рестартом Restart,CloseAll:Boolean); var ph:THandle; tp,prevst:TTokenPrivileges; rl:DWORD; begin OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,ph); LookupPrivilegeValue(Nil,'SeShutdownPrivilege',tp.Privileges[0].Luid); tp.PrivilegeCount:=1; tp.Privileges[0].Attributes:=2; AdjustTokenPrivileges(ph,FALSE,tp,SizeOf(prevst),prevst,rl); InitiateSystemShutdown(PChar(name),PChar(Message),Delay,Restart,CloseAll); ShowMessage(SysErrorMessage(GetLastError)); // Результат end;
Sergey Dubovsky
4438645@pager.mirabilis.com (2:450/103.15)