Bei empfangenem String Computer Herunterfahren

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Vielleicht hätte es geholfen die Konstanten abzufragen,
die bei der API hilfe angezeigt werden. Was ich jetzt nicht
verstehe, warum ein Reboot mit 2 den Rechner herunterfährt und
nicht neustarten sollte?
Habs nunmal nicht getestet.

Code: Alles auswählen

Debug #EWX_FORCE	    ;ist 4
Debug #EWX_LOGOFF	    ;ist 0
Debug #EWX_POWEROFF  ;Ist 8
Debug #EWX_REBOOT	    ;Ist 2
Debug #EWX_SHUTDOWN	  ;Ist 1

ExitWindowsEx_(EWX_REBOOT,#EWX_REBOOT	) ; dann wäre doch 2 ein Reboot und kein Shutdown
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Beitrag von Joel »

Ich Probiers gerade mal aus. Ich muss aber erst noch PB neu installieren weil ein Virus eben mein ganzes Windows lamgelegt hat :cry: , und desswegen musste ich XP Neu Installieren und alle meine Daten sind jetzt weg :cry: . Aber zum Glück hab ich ein Backup gemacht <) .
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Beitrag von Joel »

Ok ,ich hab versucht aber es ist so wie vorher. Der Computer Meldet sich immer ab und ich bin im Wilkommen Fenster, egal ob ich Ruhezustand oder Neustarten etc. mach. :(

Liegt das Vielleicht an SP2?
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Beitrag von Joel »

Ich habe das Archiv eben endeckt :mrgreen: . Aber so schnell darüber nix finden können also über das unten (Privilege bei ExitWindowsEX_())

Ah, bei Shutdown() kann man Privilege aufrufen oder so.

Code: Alles auswählen

#EWX_LOGOFF = 0 
  #EWX_SHUTDOWN = 1 
  #EWX_REBOOT = 2 
  #EWX_FORCE = 4 
  #EWX_POWEROFF = 8 
  #TOKEN_ADJUST_PRIVILEGES = 32    
  #TOKEN_QUERY = 8                
  #SE_PRIVILEGE_ENABLED = 2      
  #ANYSIZE_ARRAY = 1 
  #VER_PLATFORM_WIN32_NT 
Procedure Shutdown( flags.l ) 
  Privileges.TOKEN_PRIVILEGES 
  OpenProcessToken_(GetCurrentProcess_(), 40, @hToken) 
  Privileges\PrivilegeCount           = 1 
  Privileges\Privileges[0]\Attributes = #SE_PRIVILEGE_ENABLED 
  LookupPrivilegeValue_(0, "SeShutdownPrivilege", @Privileges\Privileges[0]\Luid) 
  AdjustTokenPrivileges_(hToken, 0, @Privileges, 0, 0, 0) 
  CloseHandle_(hToken) 
  ExitWindowsEx_(flags, 0) 
EndProcedure 

;Beispiel: ACHTUNG Speichern vorm ausprobieren!!! 
Shutdown(#EWX_POWEROFF)





Frage:1. Geht das bei allen Windows Versionen?
2. Kann man die Privilege auch bei ExitindowsEX_() aufrufen?



Edit:Ich habe das Archiv eben endeckt :mrgreen: . Aber so schnell darüber nix finden können also über das unten (Privilege bei ExitWindowsEX_())
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Hab hier noch was aus den alten Foren gefunden. Habs aber noch nicht getestet!

Code: Alles auswählen

SendMessage_(GetDesktopWindow_(), $112, $F140, 0); Rechner in den Standbymodus schicken

Code: Alles auswählen

ExitWindowsEx_(#EWX_POWEROFF,#SHTDN_REASON_MAJOR_OPERATINGSYSTEM))
Mit den Privilegien sollte TS bestimmt für dich eine plausible Antwort haben,
da er selbst viel mit Schutdown programmiert hat :mrgreen:
(Siehe TS-Shutdown)

Grüße Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Beitrag von Joel »

:lol: :mrgreen: :mrgreen: Klappt nicht bei mir steht da statdessen "Es sind neue Updates Verfügbar" :mrgreen: :D /:->
kiki
Beiträge: 155
Registriert: 06.05.2006 17:54

Beitrag von kiki »

Bei mir ist das auch so. Also nach ellen langer Suche hab ich auch nichts gefunden zum Thema Provilegien anfordern für ExitWindowsEX_().

Ich hoffe irgenwann kommen wir mal auf eine Antwort, weil ExitWindowsEX_() ja der einzige Code ist der auf vielen (fast allen) Windows Versionen läuft.
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Es geht auch einfacher, wenn man die Windowseigene Funktion benutzen
würde :mrgreen:

Code: Alles auswählen

RunProgram("shutdown","-s -t 00","")
Dazu könnt ihr anstelle auch eine Minutenzeit bis 99min mitgeben, wann
der Rechner heruntergefahren soll. Das geht dann ohne Vorwarnung ab.

Viel Spass beim ausprobieren :mrgreen:

Grüße Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Joel
Beiträge: 851
Registriert: 21.04.2006 19:22

Beitrag von Joel »

Aber wenn ich den Computer in den Ruhezustand versetzen will geht das ja wieder nicht.


Zusammenfassung:
1.Ich suche einen Befehl der auf möglichst vielen Windows Versionen läuft (wie, ExitWindowsEX_(), läuft ab windows 95)
2. Einen Befehl womit man alles machen kann also Herunterfahren, Neustarten, Ruhezustand, Standby usw. (Mit der Shutdown.exe geht leider nur herunterfahren)

Und dass geht glaube ich alles nur mit ExitWindowsEX_()

Um ExitWindowsEx_() zu nutzen brauch ich einen Code der die Privilegien anfordert und dass suche ich gerade.

Wenn ich ExitWindowsEX_() aufrufe ohne Privilegien meldet sich der Computer ab ich ich bin im Wilkommen-Fenster.
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

Ok, ich hab mich mal mittels Google auf die Suche gemacht und es gibt
doch tatsächlich entweder ein japanisches bzw. chinesisches Forum.
Mit den Zeichen kenne ich mich natürlich nicht so aus :mrgreen:

Aber ich habe hier was gefunden, angepasst und ausprobiert. Nicht schlecht.
Der Link des Originalsources ist am Anfang des Sources angegeben.

Code: Alles auswählen

;Projekt Shutdown Windows
;Author: http://oryaaaaa.com/forum/posting.php?mode=quote&p=180&sid=6a03a05fd151bb24d92616cfb446a95b
;Rewrite: Falko Lünsmann

  
Procedure ShutdownWIN(Endmode)
  ; Endmode=0  shutdouwn
  
  If Endmode=1 ; Suspend
    If OpenLibrary(0,"powrprof.dll") And GetFunction(0,"SetSuspendState")
      CallFunction(0,"SetSuspendState",#False,#True,#False)
      CloseLibrary(0)
    EndIf
    End
  EndIf
  
  If Endmode=2 ; Hibernate
    If OpenLibrary(0,"powrprof.dll") And GetFunction(0,"SetSuspendState")
      CallFunction(0,"SetSuspendState",#True,#True,#False)
      CloseLibrary(0)
    EndIf
    End
  EndIf
  
  If Endmode=3 ; End
    End 
  EndIf
  
  If OSVersion()=#PB_OS_Windows_XP ;#VER_PLATFORM_WIN32_NT
    #TOKEN_ADJUST_PRIVILEGES = 32
    #TOKEN_QUERY = 8
    #SE_PRIVILEGE_ENABLED = 2
    #EWX_LOGOFF = 0
    #EWX_SHUTDOWN = 1
    #EWX_REBOOT = 2
    #EWX_FORCE = 4
    #EWX_POWEROFF = 8
    Structure MyLUID
      lowpart.l
      highpart.l
      Attributes.l
    EndStructure
    Structure MyTOKEN
      PrivilegeCount.l
      lowpart.l
      highpart.l
      Attributes.l
    EndStructure
    Global hdlProcessHandle.l
    Global hdlTokenHandle.l
    Global tmpLuid.MyLUID
    Global tkp.MyTOKEN
    Global tkpNewButIgnored.MyTOKEN
    Global lBufferNeeded.l
    hdlProcessHandle = GetCurrentProcess_() 
    OpenProcessToken_(hdlProcessHandle, #TOKEN_ADJUST_PRIVILEGES | #TOKEN_QUERY, @hdlTokenHandle)
    ; Get the LUID For shutdown privilege.
    SysName.s=""+Chr(0)
    Name.s="SeShutdownPrivilege"+Chr(0)
    Erg.l=LookupPrivilegeValue_(SysName, Name, @tmpLuid)
    tmpLuid\Attributes = #SE_PRIVILEGE_ENABLED
    tkp\PrivilegeCount = 1  
    tkp\lowpart = tmpLuid\lowpart
    tkp\highpart = tmpLuid\highpart
    tkp\Attributes = tmpLuid\Attributes
    ; Enable the shutdown privilege in the access token of this process.
    Erg.l = AdjustTokenPrivileges_(hdlTokenHandle,0,@tkp,SizeOf(MyTOKEN),@tkpNewButIgnored,@lBufferNeeded)
    Erg.l = ExitWindowsEx_((#EWX_SHUTDOWN | #EWX_POWEROFF | #EWX_FORCE), 0)
    If Erg=0 
      OpenConsole()
      Buffer.s = Space(200)
      FormatMessage_(#FORMAT_MESSAGE_FROM_SYSTEM, 0, GetLastError_(), #LANG_NEUTRAL, @Buffer, 200, 0)
      PrintN(Buffer)
      Input()
      CloseConsole()
    EndIf   
    End
  ElseIf OSVersion()=#PB_OS_Windows_98 ;#VER_PLATFORM_WIN32_WINDOWS
    #EWX_FORCE=4 
    #EWX_LOGOFF=0 
    #EWX_REBOOT=2 
    #EWX_SHUTDOWN=1 
    
    ExitWindowsEx_(#EWX_SHUTDOWN|#EWX_FORCE,0)
    End
  EndIf
EndProcedure

ShutdownWIN(2); Schaltet in den Suspendmode, bei mir funktioniert das prima auf XP :D
PS: Ihr braucht dazu eine PB-Vollversion und keine Demo wegen der API
Und tragt doch bitte das in das Proil oder eure Signatur ein, damit jeder weis, mit welcher PB-Version gearbeitet wird


Grüße Falko
Zuletzt geändert von Falko am 28.07.2006 12:40, insgesamt 1-mal geändert.
Bild
Win11 Pro 64-Bit, PB_6.11b1
Antworten