2010-09-10 40 views
0

我想编写一个程序,该程序将在特定的Web服务器上运行,并定期浏览到由同一个Web服务器(IIS)托管的页面以检查某些文本。如果发现某个条件成立,它将重新启动服务器(它所在的服务器)。启动自我重启的C#代码?

我可以处理检查网页部分,这很简单。但是重新启动呢?

什么.NET对象可以帮助这个,你可以抛出一些伪代码给我吗?我认为这应该是非常简单的,因为我猜测这里有内置的东西。

+0

执行这个命令有监控/报警可用做这个软件因为你没有你描述的代码。除非预算是超级精益,否则你只是为了体验而做。 http://www.reveillesoftware.com/是一个。 – 2010-09-10 17:23:20

+0

很酷,感谢信息乔尔,但你是正确的,我发布这个编程问题在编程网站编程答案:) – BigOmega 2010-09-10 17:33:03

+0

试试这个:http://stackoverflow.com/questions/462381/restarting-windows-from -within-A净应用 – Fuzz 2010-10-06 04:04:21

回答

2

我使用此代码重新启动,注销和其他我的服务器......我希望这是你想要的。

使用:

using System.Runtime.InteropServices; 

代码:

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

重启,像这样:

DoExitWin(EWX_REBOOT); 

如果要强制重启不计什么:

DoExitWin(EWX_REBOOT | EWX_FORCE);  

如果要强制重启只有当PC挂起或花费很长:

DoExitWin(EWX_REBOOT | EWX_FORCEIFHUNG); 
1

只是System.Diagnostic.Process

shutdown -r -f