Rechner Ausschalten



  • Ich habe mir ein kleines Prog. gebastelt um mein Rechner zu einer bestimmten Zeit Auszuschalten. Mein Problem besteht darin das es unter Win 2000 prima läuft aber XP weigert sich. Kann mir jemand Helfen?

    #include<iostream>
    #include <conio.h>
    #include <time.h> 
    #include <windows.h>
    
    using namespace std;
    
    int main()
    {
    	int m_Min;
    	int m_Std;
    	int m_Aus =0;
    
        cout <<"Bitte Endzeit eingeben"<<endl;
        cout<<"Stunde : ";
        cin >>m_Std;    
        cout <<"Minuten : ";
        cin >>m_Min;
        cout <<"Endzeit = "<<m_Std<<":"<<m_Min<<endl;
    
    	for (;;)
        {    
    		time_t CurrentTime; 
    		time(&CurrentTime);   //GMT in Sekunden
    		struct tm TimeStruct = *(localtime(&CurrentTime));  //Zeit in einzelne Komponenten 
    		int Hours = TimeStruct.tm_hour;
    		int Minutes = TimeStruct.tm_min;		
    		if ((m_Min == Minutes) & (m_Std == Hours))
    		/*{
    			cout <<"AUS!!!"<<endl; // nur Zum Testen !!!
    			break;
    		}*/
    		{
    			ExitWindowsEx(EWX_POWEROFF, 0); 
    			break;
    		}
    	}
    	return 0;
    }
    


  • wahrscheinlich fehlt dir das recht SE_SHUTDOWN_NAME (oder wie das heisst). eventuell auch mal mit EWX_FORCE|EWX_SHUTDOWN versuchen. ansonsten guckst du: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/how_to_shut_down_the_system.asp



  • "The calling process must have the SE_SHUTDOWN_NAME privilege"

    http://msdn.microsoft.com/library/en-us/sysinfo/base/exitwindowsex.asp
    |
    |
    |-> http://msdn.microsoft.com/library/en-us/sysinfo/base/shutting_down.asp
     |
     |
     |-> http://msdn.microsoft.com/library/en-us/sysinfo/base/how_to_shut_down_the_system.asp
    

    Vielleicht funktioniert das ja



  • ich glaube eher die fehlt die berechtung zum runterfahren (oder vielmehr dem programm)

    binde das mal mit ein:

    BOOL SetCurrentPrivilege( LPCTSTR Privilege, BOOL bEnablePrivilege )
    {
    	HANDLE hToken;
    	LUID luid;
    	TOKEN_PRIVILEGES tp, tpPrevious;
    	DWORD cbPrevious = sizeof( TOKEN_PRIVILEGES );
    	BOOL bSuccess = FALSE;
    
    	if ( ! LookupPrivilegeValue( NULL, Privilege, &luid ) )
    		return FALSE;
    
    	if( ! OpenProcessToken( GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken ) )
    		return FALSE;
    
    	tp.PrivilegeCount = 1;
    	tp.Privileges[0].Luid = luid;
    	tp.Privileges[0].Attributes = 0;
    
    	AdjustTokenPrivileges( hToken, FALSE, &tp, sizeof( TOKEN_PRIVILEGES ), &tpPrevious, &cbPrevious );
    
    	if ( GetLastError() == ERROR_SUCCESS )
    		{
    			tpPrevious.PrivilegeCount = 1;
    			tpPrevious.Privileges[0].Luid = luid;
    
    			if ( bEnablePrivilege )
    				tpPrevious.Privileges[0].Attributes |= ( SE_PRIVILEGE_ENABLED );
    			else
    				tpPrevious.Privileges[0].Attributes &= ~( SE_PRIVILEGE_ENABLED );
    
    			AdjustTokenPrivileges( hToken, FALSE, &tpPrevious, cbPrevious, NULL, NULL );
    
    			if ( GetLastError() == ERROR_SUCCESS )
    				bSuccess=TRUE;
    	}
    	CloseHandle( hToken );
    	return bSuccess;
    }
    

    damit rufst du die funktion auf:

    SetCurrentPrivilege( SE_SHUTDOWN_NAME, TRUE );
    

    //edit da war wohl einer schneller 😃




Anmelden zum Antworten