Как выключить машину из ASP.NET - PullRequest
4 голосов
/ 06 августа 2011

У меня есть машина под управлением Windows Home Server v1 (WHS основана на Windows Server 2003 и работает под управлением IIS6), и здесь у меня есть полноценный веб-сервис, работающий на C # VS2008 (dotnet 3.5). Из веб-сервиса я хочу быть в состоянии; 1 Убедитесь, что некоторые службы Windows работают; 2 Запустите определенные службы Windows 3 Остановите некоторые службы Windows 4 Перезагрузите машину 5 Выключите машину

В течение 1-3 я использую олицетворение, чтобы поднять пользователя ASPNET до локального администратора (это только я запускаю это в локальной защищенной сети), а затем «ServiceController» для управления службами. Это отлично работает.

Для 4 и 5 у меня проблемы и я не могу заставить их работать.

Если я использую System.Diagnostics.Process для вызова команды «shutdown.exe» с параметрами «/ s / f», то процесс выполняется без ошибок, но ничего не делает! Без выключения, без исключения ничего, и я не могу понять, почему. Я попытался установить имя пользователя и пароль для локального администратора, но это не помогло, и вызов от имени другого пользователя не помог.

Мой код

string shut_args = "/s /f /t 10";
Process process1 = new Process();

process1.StartInfo.FileName = "shutdown.exe";
process1.StartInfo.WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.System);
SecureString password = new SecureString();
foreach (char c in "mypassword")
     password.AppendChar(c);
process1.StartInfo.Password = password;
process1.StartInfo.Domain = "homeserver";
process1.StartInfo.UserName = "Administrator";
process1.StartInfo.Arguments = shut_args;

process1.StartInfo.CreateNoWindow = true;
process1.StartInfo.UseShellExecute = false;
process1.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;                                

impersonateValidUser();
process1.Start();

Поэтому вместо этого я попытался использовать WMI (код взят из другого поста здесь), но здесь я получаю ошибку «Привилегия не удерживается» при попытке вызвать InvokeMethod

Mycode

ManagementBaseObject mboShutdown = null; ManagementClass mcWin32 = new ManagementClass    ("Win32_OperatingSystem"); mcWin32.Get();        
            mcWin32.Scope.Options.Impersonation = ImpersonationLevel.Impersonate;
            mcWin32.Scope.Options.Authentication = AuthenticationLevel.Connect;
            mcWin32.Scope.Options.EnablePrivileges = true;
            ManagementBaseObject mboShutdownParams = mcWin32.GetMethodParameters("Win32Shutdown");        

            // Flag 1 means we want to shut down the system. Use "2" to reboot.        
            mboShutdownParams["Flags"] = "1";        
            mboShutdownParams["Reserved"] = "0";        
            foreach (ManagementObject manObj in mcWin32.GetInstances())        
            {
                mboShutdown = manObj.InvokeMethod("Win32Shutdown", mboShutdownParams, null);        
            }

Я также прошел все свои настройки безопасности для пользователей ASPNET и NETWORK_SERVICE, и у них есть права на отключение сервера, для этих пользователей также установлены настройки безопасности WMI. Но я просто не могу понять, что не так.

Есть идеи?

Приветствия

Ответы [ 2 ]

3 голосов
/ 06 августа 2011

Вы пытались запустить простой командный файл вместо запуска процесса выключения в ASP.NET? Весь процесс описан здесь: удаленное выключение / перезапуск с использованием ASP.NET

0 голосов
/ 28 мая 2012

Старый вопрос, но я хотел сделать это сам, и только разобрался с ответом. Итак, попробуйте это:

Process process = new Process();
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = "shutdown";
startInfo.Arguments = "/s /t 5";
startInfo.UseShellExecute = true;
startInfo.Verb = "runas";
process.StartInfo = startInfo;
process.Start();
...