Chiudere Windows XP

di il
5 risposte

Chiudere Windows XP

Un saluto al Forum.
Ho un quesito non da poco. Il mio applicativo deve chiudere il sistema operativo, xp per intenderci. Ho utilizzato un vecchio approccio:

Declare Function ExitWindows Lib \"user32\" Alias \"ExitWindowsEx\" (ByVal dwReserved As Long, ByVal uReturnCode As Long) As Long

in alternativa

Declare Function ExitWindowsEx Lib \"User32.dll\" (ByVal uFlag As Long, ByVal dwReason As Long) As Boolean

con l'istruzione ExitWindows(0, 0).

Con il FrameWork di .Net questa istruzione esegue la disconnessione dell'utente corrente, e se provo a cambiare i parametri si arrabbia paracchio. Con la documentazione ho sempre poca fortura .. qualcuno ha un suggerimento?
Grazie

Titus7

5 Risposte

  • Re: Chiudere Windows XP

    Il codice seguente permette di spegnere il computer,
    effettuare il reboot, il logoff e altre operazioni analoghe su Windows XP:

    using System;
    using System.Runtime.InteropServices;

    class shoutdown{
    [StructLayout(LayoutKind.Sequential, Pack=1)]
    internal struct TokPriv1Luid
    {
    public int Count;
    public long Luid;
    public int Attr;
    }

    [DllImport(\"kernel32.dll\", ExactSpelling=true) ]
    internal static extern IntPtr GetCurrentProcess();

    [DllImport(\"advapi32.dll\", ExactSpelling=true, SetLastError=true) ]
    internal static extern bool OpenProcessToken
    ( IntPtr h, int acc, ref IntPtr phtok );

    [DllImport(\"advapi32.dll\", SetLastError=true) ]
    internal static extern bool LookupPrivilegeValue
    ( string host, string name, ref long pluid );

    [DllImport(\"advapi32.dll\", ExactSpelling=true,
    SetLastError=true) ]
    internal static extern bool AdjustTokenPrivileges
    ( IntPtr htok, bool disall,
    ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen );

    [DllImport(\"user32.dll\", ExactSpelling=true, SetLastError=true) ]
    internal static extern bool ExitWindowsEx( int flg, int rea );

    internal const int SE_PRIVILEGE_ENABLED = 0x00000002;
    internal const int TOKEN_QUERY = 0x00000008;
    internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;
    internal const string SE_SHUTDOWN_NAME = \"SeShutdownPrivilege\";
    internal const int EWX_LOGOFF = 0x00000000;
    internal const int EWX_SHUTDOWN = 0x00000001;
    internal const int EWX_REBOOT = 0x00000002;
    internal const int EWX_FORCE = 0x00000004;
    internal const int EWX_POWEROFF = 0x00000008;
    internal const int EWX_FORCEIFHUNG = 0x00000010;

    private static void DoExitWin(int flg)
    {
    bool ok;
    TokPriv1Luid tp;
    IntPtr hproc = GetCurrentProcess();
    IntPtr htok = IntPtr.Zero;
    ok = OpenProcessToken( hproc, TOKEN_ADJUST_PRIVILEGES
    | TOKEN_QUERY, ref htok );
    tp.Count = 1;
    tp.Luid = 0;
    tp.Attr = SE_PRIVILEGE_ENABLED;
    ok = LookupPrivilegeValue( null, SE_SHUTDOWN_NAME, ref tp.Luid );
    ok = AdjustTokenPrivileges( htok, false, ref tp, 0, IntPtr.Zero,
    IntPtr.Zero );
    ok = ExitWindowsEx( flg, 0 );
    }

    public static void Main()
    {
    Console.WriteLine(\"Sto per spegnere il computer...\");
    //Modificare EWX_SHUTDOWN con EWX_LOGOFF, EWX_REBOOT, ecc, ecc...
    DoExitWin(EWX_SHUTDOWN);
    }
    }
  • Re: Chiudere Windows XP

    Grazie mille!!
    Per caso hai lo stesso codice in vb? non sono pratico di c#.
  • Re: Chiudere Windows XP

    E se lanci il processo showdown di windows????
  • Re: Chiudere Windows XP

    Finalmente sono riuscito ad attivare la password per accedere al forum.
    Scusate la prolungata assenza.

    Dunque lanciare lo showdown?
    Io lancio la procedura di shotdown del SO. Ma, a quanto pare, questa funzione effettua solo la disconnessione dell'utente corrente, nonostante provi a forzare la procedura con i diversi parametri.
    Ora vedo cosa ne esce fuori. Grazie mille

    Titus7
  • Re: Chiudere Windows XP

    Quali paramentri usi?
    posta il codice.....
Devi accedere o registrarti per scrivere nel forum
5 risposte