Avatar billede nubi19 Nybegynder
09. juni 2002 - 15:03 Der er 37 kommentarer og
1 løsning

Luk Windows fra program ?

Jeg bruger BCB4 og vil lave et program der kan slukke windows eller genstarte (man kan vælge det i programmet) på et klokslet (justerer man selv).
Men programmet skal fungere lige gyldig om man kører win9x eller NT (2k og XP), dvs. jeg kan ikke bare bruge en fast funktion til f.eks. 2k.
Jeg fik engang lavet et sådanne program i VB, der var noget med noget AdjustToken (så man fik rettigheder til at lukke windows ned). Selve nedluknigen foregik via API'en.

Problemet er at jeg ikke kan få det til at fungere i C, og har nu næsten opgivet, håber lidt nogen herinde kan hjælpe :)
Avatar billede kamikaze Nybegynder
09. juni 2002 - 15:18 #1
ExitWindowsEx
The ExitWindowsEx function either logs off the current user, shuts down the system, or shuts down and restarts the system. It sends the WM_QUERYENDSESSION message to all applications to determine if they can be terminated.

BOOL ExitWindowsEx(
  UINT uFlags,      // shutdown operation
  DWORD dwReserved  // reserved
);
Avatar billede kamikaze Nybegynder
09. juni 2002 - 15:19 #2
Mht. Windows versioner:

Windows NT: To shut down or restart the system, the calling process must use theAdjustTokenPrivileges function to enable the SE_SHUTDOWN_NAME privilege. For more information about security privileges, seePrivileges.

Windows 95: ExitWindowEx does not work from a console application, as it does on Windows NT.
Avatar billede kamikaze Nybegynder
09. juni 2002 - 15:24 #3
Du kan evt. bruge flg. til at finde ud af hvilken version af Windows programmet bliver afviklet fra:

The GetVersionEx function obtains extended information about the version of the operating system that is currently running.

BOOL GetVersionEx(
  LPOSVERSIONINFO lpVersionInformation  // pointer to version
                                        // information structure
);
Avatar billede kamikaze Nybegynder
09. juni 2002 - 15:25 #4
Hvor LPOSVERSIONINFO er af typen:

typedef struct _OSVERSIONINFO{
    DWORD dwOSVersionInfoSize;
    DWORD dwMajorVersion;
    DWORD dwMinorVersion;
    DWORD dwBuildNumber;
    DWORD dwPlatformId;
    TCHAR szCSDVersion[ 128 ];
} OSVERSIONINFO;
Avatar billede zob Nybegynder
09. juni 2002 - 15:27 #5
Kamikaze-->
spiller du på net-x ? altså cs
Avatar billede nubi19 Nybegynder
09. juni 2002 - 15:48 #6
Øh kamikaze hvor skal typedef struct osv. stå henne af i koden ?
Avatar billede dennerg4 Nybegynder
09. juni 2002 - 15:53 #7
Hvor kan jeg download BCB4 ?
Avatar billede nubi19 Nybegynder
09. juni 2002 - 21:21 #8
Kamikaze er du væk ?
Jeg fatter desværre nissemand af alt det der, har prøvet at rode frem og tilbage med det, men det vil ligesom ikke som jeg. Kan du ikke forklare mig hvad der skal stå hvor ? Og hvor meget jeg selv skal skrive ? (F.eks. den typedef der, den eksisterer jo allerede).
Avatar billede kamikaze Nybegynder
09. juni 2002 - 22:50 #9
zob >> nope!

nubi19 >> Ok, laver lige et eksempel...
Avatar billede nubi19 Nybegynder
09. juni 2002 - 22:57 #10
Tusind mange tak :)
Avatar billede kamikaze Nybegynder
09. juni 2002 - 22:59 #11
Følgende fortæller dig hvilken version af windows du kører (Hvis du ikke selv skulle vide det LOL) :

#include <iostream.h>
#include <conio.h>
#include <windows.h>

void main()
{
    OSVERSIONINFO osi;
    ZeroMemory((void*) &osi, sizeof(OSVERSIONINFO));
    osi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);

    GetVersionEx(&osi);

    if (osi.dwPlatformId == VER_PLATFORM_WIN32_NT)
    {
        cout << "Du kører Windows NT" << endl;
    }
    if (osi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS &&
        osi.dwMinorVersion == 0)
    {
        cout << "Du kører Windows 95" << endl;
    }
    if (osi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS &&
        osi.dwMinorVersion > 0)
    {
        cout << "Du kører Windows 98" << endl;
    }
    getch();
}
Avatar billede kamikaze Nybegynder
09. juni 2002 - 23:01 #12
Så nu ved du altså hvilken Windows version vi har med at gøre. Istedet for at skrive navnet ud, så skal vi bare lukke windows på den rigtige måde...
Avatar billede kamikaze Nybegynder
09. juni 2002 - 23:09 #13
Lige et lille eksempel der kører i Visual C++, konsol:

#include <iostream.h>
#include <conio.h>
#include <windows.h>

void main()
{
    OSVERSIONINFO osi;
    ZeroMemory((void*) &osi, sizeof(OSVERSIONINFO));
    osi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);

    GetVersionEx(&osi);

    if (osi.dwPlatformId == VER_PLATFORM_WIN32_NT)
    {
        cout << "Genstarter Windows NT" << endl;
        ExitWindowsEx(EWX_LOGOFF, EWX_FORCE);
    }
    if (osi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
    {
        cout << "Genstarter Windows 95" << endl;
        Sleep(2000);
        ExitWindowsEx(EWX_SHUTDOWN, EWX_FORCE);
    }
   
    getch();
}
Avatar billede kamikaze Nybegynder
09. juni 2002 - 23:10 #14
Det er ikke nødvendigt at bruge AdjustTokenPrivileges() på min maskine der er en Win2k...
Avatar billede nubi19 Nybegynder
09. juni 2002 - 23:18 #15
Øhm undskyld mig, men EWX_LOGOFF logger da bare en af i NT ?
Og EWX_SHUTDOWN lukker da vel computeren helt ?
Ellers najst eksempel, det skal nok komme til at du' :)
Avatar billede kamikaze Nybegynder
09. juni 2002 - 23:19 #16
Øhh...ja, du har ret EWX_LOGOFF logger bare af...Det må være EWX_REBOOT du skal bruge :-)
Avatar billede kamikaze Nybegynder
09. juni 2002 - 23:21 #17
Ok, jeg får ikke lov til at reboote maskinen, så der skal du vist igang med dine privileges på NT...... :-(
Avatar billede nubi19 Nybegynder
09. juni 2002 - 23:23 #18
Damn det var det jeg frygtede, for dem fatter jeg klaphat af, sådan virkelig seriøst.
Havde lidt gang i det, men det gik helt i kage, med cannot convert long to void * * og lignende skidt :(
Avatar billede nubi19 Nybegynder
09. juni 2002 - 23:24 #19
Jeg har ikke flere point at give af :(
Men vil du godt hjælpe mig med de privileges alligevel ?
du kan evt. få lidt extra point når jeg engang får nogen ?
Avatar billede kamikaze Nybegynder
09. juni 2002 - 23:46 #20
Hmm...Det er ikke så meget point, det er mere tidspunktet... Kigger på det imorgen :-)
Avatar billede kamikaze Nybegynder
10. juni 2002 - 00:16 #21
Ok, kunne alligevel ikke sove, her kommer en funktion der virker:
Avatar billede kamikaze Nybegynder
10. juni 2002 - 00:17 #22
#include <iostream.h>
#include <conio.h>
#include <windows.h>

bool RebootWindows()
{
    OSVERSIONINFO osi;
    ZeroMemory((void*) &osi, sizeof(OSVERSIONINFO));
    osi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);

    GetVersionEx(&osi);

    if (osi.dwPlatformId == VER_PLATFORM_WIN32_NT)
    {
        HANDLE hToken;
        TOKEN_PRIVILEGES tkp;

        if (!OpenProcessToken(GetCurrentProcess(),
                              TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
                              &hToken))
            return false;

        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);

        if (GetLastError() != ERROR_SUCCESS) return false; 

        if (!ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0)) return false;
        return true;
    }
    if (osi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
    {
        if (!ExitWindowsEx(EWX_REBOOT, EWX_FORCE)) return false;
        return true;
    }
    return false;
}

void main()
{   
    RebootWindows();
}
Avatar billede kamikaze Nybegynder
10. juni 2002 - 00:18 #23
Det virker i MSVC++, så mon ikke også det virker i builder :-)
Avatar billede kamikaze Nybegynder
10. juni 2002 - 00:18 #24
(har ikke testet om win9x virker!!!)
Avatar billede kamikaze Nybegynder
10. juni 2002 - 01:24 #25
Win9x virker nok ikke fra en DOS-prompt:

Windows 95: ExitWindowEx does not work from a console application, as it does on Windows NT.
Avatar billede nubi19 Nybegynder
10. juni 2002 - 08:04 #26
Nu smuttede jeg hen og sove igår, da jeg skal til eksamen idag. Så du behøvede sådan set ikke have lavet det igår.
Jeg skal ikke lave en console app, så 9x kommer nok også til at virke :)
Avatar billede nubi19 Nybegynder
10. juni 2002 - 09:17 #27
Virker fint i NT, men der en ting jeg ikke forstår:
Hvorfor er de her to forskellige ?:
if (!ExitWindowsEx(EWX_REBOOT, EWX_FORCE)) return false;
og
if (!ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0)) return false;
Altså hvorfor står der forskellige ting i parentesen ?
Derudover tænkte jeg på om jeg kan erstatte EWX_REBOOT af en variabel, så jeg på en nem måde kan vælge mellem reboot & shutdown ? (Altså hvilken variabel type skal det være så).
Ellers kanon mange tak for hjælpen, du er lidt skrap til det her synes jeg :)
Avatar billede kamikaze Nybegynder
10. juni 2002 - 11:16 #28
Du kan vælge mellem EWX_REBOOT, EWX_SHUTDOWN, EWX_LOGOFF og EWX_POWEROFF.

Det gøres på flg. måde:

DWORD ExitType;                  // Variabel til at holde typen
ExitType = EWX_REBOOT;          // Fx. reboot
ExitWindows(ExitType, EWX_FORCE);// Udfør
Avatar billede kamikaze Nybegynder
10. juni 2002 - 11:20 #29
Mht. forskel imellem de to ExitWindows-kald er det en fejl.

Det andet kald (win9x) skal være magen til det første....(godt set) :-)
Avatar billede nubi19 Nybegynder
10. juni 2002 - 12:28 #30
Nu vil jeg lige være lidt mere besværlig:
Det skal altså være:
if (ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0)) return false;
?
Hvad betyder 0'et så ?
Avatar billede nubi19 Nybegynder
10. juni 2002 - 12:33 #31
btw. conio.h er tilsyneladende ikke nødvendig i BCB.
Avatar billede kamikaze Nybegynder
10. juni 2002 - 13:09 #32
conio.h var kun for den sidste getch(), og derfor ikke nødvendig mere.

0'et i ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0) betyder ikke noget:

BOOL ExitWindowsEx(
  UINT uFlags,      // shutdown operation
  DWORD dwReserved  // reserved
);

dwReserved
Reserved; this parameter is ignored.
Avatar billede kamikaze Nybegynder
10. juni 2002 - 13:10 #33
RETTELSE:

Du kan vælge mellem EWX_REBOOT, EWX_SHUTDOWN, EWX_LOGOFF og EWX_POWEROFF.

Det gøres på flg. måde:

DWORD ExitType;                  // Variabel til at holde typen
ExitType = EWX_REBOOT;          // Fx. reboot
ExitWindows(ExitType | EWX_FORCE, 0);// Udfør
Avatar billede kamikaze Nybegynder
10. juni 2002 - 13:11 #34
(Hvordan gik eksamen???)
Avatar billede nubi19 Nybegynder
10. juni 2002 - 13:19 #35
Gik fint, jeg fik 9 i tysk, uden at have læst og uden noter :)
Og så fik jeg hat på (HTX), så det er bare dæjli :)
Tjekker lige at det hele duer, og så smider jeg point efter dig.
Avatar billede nubi19 Nybegynder
10. juni 2002 - 14:08 #36
Weee det kører nu.
Btw. så skal man bruge EWX_SHUTDOWN til 9x, og EWX_POWEROFF til NT kernen, fjollet imo, men pyt.
Tusind mange tak for din uvurderlige hjælp :)
Avatar billede kamikaze Nybegynder
10. juni 2002 - 14:14 #37
Takker for points :-)
Avatar billede nubi19 Nybegynder
10. juni 2002 - 14:49 #38
Hey du har fortjent dem og lidt til, har bare ik fler' :(
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester