^System runterfahren klappt nicht



  • Hallo,

    versuche gerade das System herunterzufahren(Will mir den lästigen weg über Start-->Herunterfahren->Herunterfahren umgehen).
    Versuche das mit dem Code aus der FAQ

    Doch da erhalte ich ne Handvoll Fehlermeldungen. Daher stellt sich mir die Frage, welcher Header Dateien, Klassen und sonstige Elemente ich hierfür brauche.

    Das Beispiel sieht so aus

    HANDLE hToken; 
       TOKEN_PRIVILEGES tkp; 
    
       // Get a token for this process. 
    
       if (!OpenProcessToken(GetCurrentProcess(), 
            TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) 
          return( FALSE ); 
    
       // Get the LUID for the shutdown privilege. 
    
       LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, 
            &tkp.Privileges[0].Luid); 
    
       tkp.PrivilegeCount = 1;  // one privilege to set    
       tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
    
       // Get the shutdown privilege for this process. 
    
       AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, 
            (PTOKEN_PRIVILEGES)NULL, 0); 
    
       if (GetLastError() != ERROR_SUCCESS) 
          return FALSE; 
    
       // Shut down the system and force all applications to close. 
    
       if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 
                   SHTDN_REASON_MAJOR_OPERATINGSYSTEM |
                   SHTDN_REASON_MINOR_UPDATE |
                   SHTDN_REASON_FLAG_PLANNED))
    

    Fehlermeldung sind das er HANDLE TOKEN uisw nicht kennt

    Vielleicht kann mir jemand kurz sagen welche Sachen ich hier einbinden muß.

    'Grüße Felix



  • gehts nicht auch einfacher?

    ExitWindowsEx(EWX_SHUTDOWN)

    sollte eigentlich auch gehen (schau mal MSDN nach).
    Weiß aber nicht genau, ob das auch bei XP problemlos geht.



  • Das Beispiel steht so auch in der MSDN drin



  • Hab den Code jetzt mal etwas zusammengebrochen, was man meines ersachtens braucht.

    m_iParameter=EWX_SHUTDOWN;
        m_iParameter=m_iParameter |EWX_FORCE;
        ExitWindowsEx(m_iParameter,0);
    

    Doch das geht auch net, obwohl ich jetzt die Header Datei "#include "winuser.h""

    eingebunden habe die die defines für diese Routine enthält.

    Denn aufruf ExitWindowsEX akzeptiert er auch net. Wo steht der den drin?



  • hmm bei mir geht der Befehl:

    ExitWindowsEx(EWX_SHUTOWN,0);

    damit geht mein rechner aus.
    Dazu braucht man eigentlich keine explezite Header-Datei oder sonst was.
    lass mal den kram mit den parametern. setz das mal alles zusammen und teste.



  • bierber schrieb:

    Denn aufruf ExitWindowsEX akzeptiert er auch net. Wo steht der den drin?

    MSDN schrieb:

    Header: Declared in Winuser.h; include Windows.h.



  • Ok habe nun folgende Header eingebunden:

    #include <iostream> 
    #include <ctime> 
    #include "winuser.h"
    #include "Windows.h"
    #include "stdafx.h"
    #include "math.h"
    

    welcher fehlt den noch, ich versteh es net.
    Wenn ich mit rechts auf die Defines gehe und sage "Gehe zu Deklaration" springt er ind die Winuser.h. Da steht auch was von der "ExitWindowsEx" Funktion, aber er will einfach nicht eingestehen das er die defines und die Funktion kennt



  • Probier mal

    InitiateSystemShutdown(NULL,NULL,0,1,0);
    

    anstatt

    ExitWindowEx(...)
    

    Desweiteren musst du nicht extra "winuser.h" einbinden. Das macht "windows.h" schon.

    Btw. inkludiert man Standard-Headerfiles mit eckigen Klammern <>. Nur wegen der Förmlichkeit, glaube nicht, dass du DARAN scheiterst.

    MfG



  • Bringt genauso ne Fehlermeldung.

    Kann mir mal jemand ein Programm schreiben, welches beim start einen Timer auslöst, der nach Ablauf in einer Funktion Windows runterfährt. Das scheint ja net so schwer zu sein, vielleicht hab ich da ja auch einen anderen Fehler gemacht der gar nix mit der Funktion selber zu tun hat.

    Das wäre mal voll nett.

    Ich verzweifle



  • Hab' nochmal editiert. Aber das tut wohl nix zur Sache. Es wär' hilfreich, wenn du den exakten Fehler posten könntest.

    MfG



  • Der Fehler ist:

    Fehler 1 error C2065: 'NULL': nichtdeklarierter Bezeichner
    Fehler 2 error C3861: "InitiateSystemShutdown": Bezeichner wurde nicht gefunden.



  • könntest du mal den code hier reinpacken, wo du das alles aufrufst? Die fehler sind zu allgemein



  • ok hab mal das ganze Projekt gepostet.

    Form1.h

    #pragma once
    
    namespace dummy {
    
    	using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Data;
    	using namespace System::Drawing;
    
    	/// <summary>
    	/// Zusammenfassung für Form1
    	///
    	/// Warnung: Wenn Sie den Namen dieser Klasse ändern, müssen Sie auch
    	///          die Ressourcendateiname-Eigenschaft für das Tool zur Kompilierung verwalteter Ressourcen ändern,
    	///          das allen RESX-Dateien zugewiesen ist, von denen diese Klasse abhängt.
    	///          Anderenfalls können die Designer nicht korrekt mit den lokalisierten Ressourcen
    	///          arbeiten, die diesem Formular zugewiesen sind.
    	/// </summary>
    	public ref class Form1 : public System::Windows::Forms::Form
    	{
    	public:
    		Form1(void)
    		{
    			InitializeComponent();
    			//
    			//TODO: Konstruktorcode hier hinzufügen.
    			//
    		}
    
    	protected:
    		/// <summary>
    		/// Verwendete Ressourcen bereinigen.
    		/// </summary>
    		~Form1()
    		{
    			if (components)
    			{
    				delete components;
    			}
    		}
    	private: System::Windows::Forms::Timer^  timer1;
    	protected: 
    	private: System::ComponentModel::IContainer^  components;
    
    	private:
    		/// <summary>
    		/// Erforderliche Designervariable.
    		/// </summary>
    
    #pragma region Windows Form Designer generated code
    		/// <summary>
    		/// Erforderliche Methode für die Designerunterstützung.
    		/// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
    		/// </summary>
    		void InitializeComponent(void)
    		{
    			this->components = (gcnew System::ComponentModel::Container());
    			this->timer1 = (gcnew System::Windows::Forms::Timer(this->components));
    			this->SuspendLayout();
    			// 
    			// timer1
    			// 
    			this->timer1->Tick += gcnew System::EventHandler(this, &Form1::timer1_Tick);
    			// 
    			// Form1
    			// 
    			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
    			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    			this->ClientSize = System::Drawing::Size(292, 266);
    			this->Name = L"Form1";
    			this->ShowInTaskbar = false;
    			this->Text = L"Form1";
    			this->WindowState = System::Windows::Forms::FormWindowState::Minimized;
    			this->Load += gcnew System::EventHandler(this, &Form1::Form1_Load);
    			this->ResumeLayout(false);
    
    		}
    #pragma endregion
    	private: System::Void timer1_Tick(System::Object^  sender, System::EventArgs^  e)
    			 {
    				  system("C:\\WINDOWS\\System32\\shutdown.exe -s -f -t 0 "); 
    			 }
    
    	private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) 
    			 {
    				 Random^ randObj = gcnew Random();//gcnew ist afair eine new-Version für managed Objekte 
    				 double g;
    				 int wert;
    
    				 g = randObj->NextDouble();
    				 wert=(int) (g*500000);
    				 timer1->Interval=wert;
    				 timer1->Start();
    			 }
    	};
    }
    

    dummy.cpp

    // dummy.cpp: Hauptprojektdatei.
    #include <iostream> 
    #include <ctime> 
    #include <stdlib.h> 
    #include "winuser.h"
    #include "winreg.h"
    #include "Windows.h"
    #include "stdafx.h"
    #include "math.h"
    #include "Form1.h"
    
    using namespace dummy;
    
    [STAThreadAttribute]
    int main(array<System::String ^> ^args)
    {
    	// Aktivieren visueller Effekte von Windows XP, bevor Steuerelemente erstellt werden
    	Application::EnableVisualStyles();
    	Application::SetCompatibleTextRenderingDefault(false); 
    
    	// Hauptfenster erstellen und ausführen
    	Application::Run(gcnew Form1());
    
    	return 0;
    }
    

    Das wars eigentlich im großen und ganzen



  • #include <windows.h>
    
    int WINAPI WinMain(HINSTANCE hInstance,
    				   HINSTANCE hPrevInstance,
    				   PSTR lpCmdLine,
    				   int iCmdShow)
    
    {
       HANDLE hToken;
       TOKEN_PRIVILEGES tkp;
    
       // Get a token for this process.
    
       if (!OpenProcessToken(GetCurrentProcess(),
            TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
          return( FALSE );
    
       // Get the LUID for the shutdown privilege.
    
       LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
            &tkp.Privileges[0].Luid);
    
       tkp.PrivilegeCount = 1;  // one privilege to set    
       tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    
       // Get the shutdown privilege for this process.
    
       AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
            (PTOKEN_PRIVILEGES)NULL, 0);
    
       if (GetLastError() != ERROR_SUCCESS)
          return FALSE;
    
       // Shut down the system and force all applications to close.
    
       InitiateSystemShutdown(NULL,NULL,0,1,0);
       return (0);
    }
    

    Mit diesem sauberen Code habe ich soeben meinen Rechner heruntergefahren. Der funktioniert also! Du musst nur gucken, was bei dir anders ist und das ändern. Bitte teile uns noch mit woran es lag!

    MfG



  • Solangsam hab ich das Gefühl, das bei mir was faul ist. kannst du mir mal dein Projekt schicken? Email kommt per pn



  • ok pn geht hier ja gar net. hab mal mein Profil geändert, damit du mir eine Mail schreiben kannst. dann schick ich dir meine zurück



  • stdafx.h muss als erstens abgegeben werden, alle header drüber werden ignoriert



  • das ist ein .NET project, nix MFC

    void COwnDlg::ShutDown()
    {
        HANDLE hToken;
        TOKEN_PRIVILEGES tkp;
        OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken );
        LookupPrivilegeValue( NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid ); 
        tkp.PrivilegeCount = 1;	
        tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;   
        AdjustTokenPrivileges( hToken, FALSE, &tkp, 0, ( PTOKEN_PRIVILEGES ) NULL, 0 );
    
        int iButton = GetCheckedRadioButton( IDC_RADIO1, IDC_RADIO3 );
        if( iButton == IDC_RADIO1 ){
            ExitWindowsEx( ID_SHUTDOWN, 0 );
            ::exit( 0 );
        }
        if( iButton == IDC_RADIO2 ){
            ExitWindowsEx( ID_RESTART, 0 );
            ::exit( 0 );
        }
        if( iButton == IDC_RADIO3 ){
            ExitWindowsEx( ID_LOGOFF, 0 );
            ::exit( 0 );
        }
    }
    

    da haste sogar 3 radio buttons wo du zwischen runterfahren / neustarten / ausloggen unterscheiden kannst
    mit den privilegien holen usw solltest du immer machen da es ja auch sein kann das man nicht als admin eingeloggt ist, dann machts probleme


Anmelden zum Antworten