views:

93

answers:

2

I want to write a program that will run on a specific web server and periodically browse to a page that is being hosted by that same web server (IIS) to check for certain text. If a certain condition was found to be true, it would initiate a reboot of the server (the one it is residing on).

I can handle the checking the webpage part, that's pretty simple. But what about the reboot?

What .NET objects are available that can help with this and can you throw down some pseudo code for me? I assume this should be pretty simple as I'm guessing there are things built in for this.

+2  A: 

I used this code to reboot, logoff and other my servers... I hope this is what you want.

Using:

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 like so:

DoExitWin(EWX_REBOOT);

If you want to force reboot no meter what:

DoExitWin(EWX_REBOOT | EWX_FORCE);    

If you want to force reboot only if the pc hangs or it takes to long:

DoExitWin(EWX_REBOOT | EWX_FORCEIFHUNG);
Cipi
+1  A: 

Just execute this command with System.Diagnostic.Process

shutdown -r -f
Vitaly