2010-09-10 16 views
0

Je veux écrire un programme qui sera exécuté sur un serveur Web spécifique et naviguer périodiquement vers une page qui est hébergée par ce même serveur Web (IIS) pour vérifier certains textes. Si une certaine condition a été trouvée comme étant vraie, cela entraînerait un redémarrage du serveur (celui sur lequel il réside).Code C# qui initie un redémarrage automatique?

Je peux gérer la vérification de la partie de la page Web, c'est assez simple. Mais qu'en est-il du redémarrage?

Quels sont les objets .NET disponibles qui peuvent aider à cela et pouvez-vous jeter un peu de pseudo-code pour moi? Je suppose que cela devrait être assez simple car je devine qu'il y a des choses construites pour cela.

+0

Il surveillent/alerte des logiciels qui sont disponibles pour le faire pour vous sans le code que vous décrivez. Sauf si le budget est super mince ou si vous êtes juste à faire pour l'expérience. http://www.reveillesoftware.com/ en est un. –

+0

Cool, merci pour l'info Joel, mais vous avez raison, j'ai posté cette question de programmation dans un site de programmation pour une réponse de programmation :) – BigOmega

+0

Essayez ceci: http://stackoverflow.com/questions/462381/restarting-windows-from -with-a-net-application – Fuzz

Répondre

2

J'ai utilisé ce code pour redémarrer, déconnecter et autres serveurs ... J'espère que c'est ce que vous voulez.

utilisant:

using System.Runtime.InteropServices; 

code:

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

    public const int SE_PRIVILEGE_ENABLED = 0x00000002; 
    public const int TOKEN_QUERY = 0x00000008; 
    public const int TOKEN_ADJUST_PRIVILEGES = 0x00000020; 
    public const string SE_SHUTDOWN_NAME = "SeShutdownPrivilege"; 
    public const int EWX_LOGOFF = 0x00000000;        //Logoff flag 
    public const int EWX_SHUTDOWN = 0x00000001;       //Shutdown 
    public const int EWX_REBOOT = 0x00000002;        //Reboot 
    public const int EWX_FORCE = 0x00000004;        //Force Logoff, shutdown or Reboot, add like this (EWX_REBOOT | EWX_FORCE) 
    public const int EWX_POWEROFF = 0x00000008;       //Forced shutdown 
    public const int EWX_FORCEIFHUNG = 0x00000010;      //Forced Logoff, shutdown or reboot if pc hangs 


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

Reboot comme ceci:

DoExitWin(EWX_REBOOT); 

Si vous voulez forcer le redémarrage pas de compteur quoi:

DoExitWin(EWX_REBOOT | EWX_FORCE);  

Si vous voulez forcer le redémarrage que si le PC se bloque ou il prend trop de temps:

DoExitWin(EWX_REBOOT | EWX_FORCEIFHUNG); 
1

execute Juste cette commande avec System.Diagnostic.Process

shutdown -r -f