Q&A

  • Win NT에서 재부팅할 수 있는 방법은 과연 없는가요???
안녕하세요.



필요한 일이 있어서 Windows NT를 재부팅할 수 있는 프로그램을 찾다가 아래와 같은

것이 가능하다기에 델파이로 실행을 해보니 Run조차 되지를 않았습니다.



======================================================================

var

PreviosPrivileges : ^TTokenPrivileges;

TokenPrivileges : TTokenPrivileges;

ProcessHandle : THandle;

tmp : Integer;

begin

if not OpenProcessToken( GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES+TOKEN_QUERY,ProcessHandle ) then

Exit;



LookupPrivilegeValue( '', 'SeShutdownPrivilege', TokenPrivileges.Privileges[0].Luid );

TokenPrivileges.PrivilegeCount := 1;

TokenPrivileges.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;

tmp := 0;

PreviosPrivileges := nil;

AdjustTokenPrivileges(ProcessHandle, False, TokenPrivileges, 0, PreviosPrivileges^, tmp);

if not GetLastError()=ERROR_SUCCESS then

Exit;

if not InitiateSystemShutdown( '', '', 0, True, True ) then

Exit;

TokenPrivileges.Privileges[0].Attributes := 0;

AdjustTokenPrivileges( ProcessHandle, False, TokenPrivileges,

0,PreviosPrivileges^, tmp );

end;

==================================================================



에러메세지는 다음과 같습니다.

Error[41] : 'Types of actual and formal var parameters must be identical'

Error[47] : 'Types of actual and formal var parameters must be identical'



즉, AdjustTokenPrivileges()함수가 쓰여진 줄에서 에러가 발생합니다.



누군가 이 함수가 에러가 없다고 하였는데 저는 왜 이런 에러가 발생하여 실행조차 되지 않는지 모르겠습니다.



고수님들이 한수 지도 부탁드립니다.



2  COMMENTS
  • Profile
    김상호 2000.12.15 05:12
    ExitWindowsEx(EWX_SHUTDOWN,0); // 종료



    ExitWindowsEx(EWX_REBOOT,0) ; // 재부팅



    이 명령이 작동되는지 모르겠네요... 한번 해보세요..





    홍진혁 wrote:

    > 안녕하세요.

    >

    > 필요한 일이 있어서 Windows NT를 재부팅할 수 있는 프로그램을 찾다가 아래와 같은

    > 것이 가능하다기에 델파이로 실행을 해보니 Run조차 되지를 않았습니다.

    >

    > ======================================================================

    > var

    > PreviosPrivileges : ^TTokenPrivileges;

    > TokenPrivileges : TTokenPrivileges;

    > ProcessHandle : THandle;

    > tmp : Integer;

    > begin

    > if not OpenProcessToken( GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES+TOKEN_QUERY,ProcessHandle ) then

    > Exit;

    >

    > LookupPrivilegeValue( '', 'SeShutdownPrivilege', TokenPrivileges.Privileges[0].Luid );

    > TokenPrivileges.PrivilegeCount := 1;

    > TokenPrivileges.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;

    > tmp := 0;

    > PreviosPrivileges := nil;

    > AdjustTokenPrivileges(ProcessHandle, False, TokenPrivileges, 0, PreviosPrivileges^, tmp);

    > if not GetLastError()=ERROR_SUCCESS then

    > Exit;

    > if not InitiateSystemShutdown( '', '', 0, True, True ) then

    > Exit;

    > TokenPrivileges.Privileges[0].Attributes := 0;

    > AdjustTokenPrivileges( ProcessHandle, False, TokenPrivileges,

    > 0,PreviosPrivileges^, tmp );

    > end;

    > ==================================================================

    >

    > 에러메세지는 다음과 같습니다.

    > Error[41] : 'Types of actual and formal var parameters must be identical'

    > Error[47] : 'Types of actual and formal var parameters must be identical'

    >

    > 즉, AdjustTokenPrivileges()함수가 쓰여진 줄에서 에러가 발생합니다.

    >

    > 누군가 이 함수가 에러가 없다고 하였는데 저는 왜 이런 에러가 발생하여 실행조차 되지 않는지 모르겠습니다.

    >

    > 고수님들이 한수 지도 부탁드립니다.

    >

  • Profile
    홍진혁 2000.12.15 08:34
    김상호님께서 답변해주신 ExitWindowsEx()함수는 Windows 95/98에서만 사용가능한 함수입니다.

    그리고, 제가 가진 OS는 Windows NT이구요.

    그리고, AdjustTokenPrivileges(ProcessHandle, False, TokenPrivileges, 0, PreviosPrivileges^, tmp) 함수의 맨 끝인자 (즉, tmp)를 다음과 같이 선언을 해도 역시 같은 에러가 뜹니다.



    tmp : DWORD;



    역시 Windows NT에서의 재부팅은 불가능한것인가요????



    답변 부탁드립니다.





    김상호 wrote:

    > ExitWindowsEx(EWX_SHUTDOWN,0); // 종료

    >

    > ExitWindowsEx(EWX_REBOOT,0) ; // 재부팅

    >

    > 이 명령이 작동되는지 모르겠네요... 한번 해보세요..

    >

    >

    > 홍진혁 wrote:

    > > 안녕하세요.

    > >

    > > 필요한 일이 있어서 Windows NT를 재부팅할 수 있는 프로그램을 찾다가 아래와 같은

    > > 것이 가능하다기에 델파이로 실행을 해보니 Run조차 되지를 않았습니다.

    > >

    > > ======================================================================

    > > var

    > > PreviosPrivileges : ^TTokenPrivileges;

    > > TokenPrivileges : TTokenPrivileges;

    > > ProcessHandle : THandle;

    > > tmp : Integer;

    > > begin

    > > if not OpenProcessToken( GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES+TOKEN_QUERY,ProcessHandle ) then

    > > Exit;

    > >

    > > LookupPrivilegeValue( '', 'SeShutdownPrivilege', TokenPrivileges.Privileges[0].Luid );

    > > TokenPrivileges.PrivilegeCount := 1;

    > > TokenPrivileges.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;

    > > tmp := 0;

    > > PreviosPrivileges := nil;

    > > AdjustTokenPrivileges(ProcessHandle, False, TokenPrivileges, 0, PreviosPrivileges^, tmp);

    > > if not GetLastError()=ERROR_SUCCESS then

    > > Exit;

    > > if not InitiateSystemShutdown( '', '', 0, True, True ) then

    > > Exit;

    > > TokenPrivileges.Privileges[0].Attributes := 0;

    > > AdjustTokenPrivileges( ProcessHandle, False, TokenPrivileges,

    > > 0,PreviosPrivileges^, tmp );

    > > end;

    > > ==================================================================

    > >

    > > 에러메세지는 다음과 같습니다.

    > > Error[41] : 'Types of actual and formal var parameters must be identical'

    > > Error[47] : 'Types of actual and formal var parameters must be identical'

    > >

    > > 즉, AdjustTokenPrivileges()함수가 쓰여진 줄에서 에러가 발생합니다.

    > >

    > > 누군가 이 함수가 에러가 없다고 하였는데 저는 왜 이런 에러가 발생하여 실행조차 되지 않는지 모르겠습니다.

    > >

    > > 고수님들이 한수 지도 부탁드립니다.

    > >