Перезапустите окна со страницы asp.net с помощью командной строки и System.Diagnostics.Process
Я пытаюсь перезапустить Windows Server 2003 изнутри веб-службы с помощью System.Diagnostics.Process.
public static string Dorestart()
{
var si = new Process();
si.StartInfo.UserName = "administrator"; // Credentials of administrator user
var sc = new SecureString();
foreach (char c in "AdminPassword")
{
sc.AppendChar(c);
}
si.StartInfo.Password = sc;
si.StartInfo.UseShellExecute = false;
si.StartInfo.FileName = "cmd.exe";
si.StartInfo.Arguments = "\"c:\\windows\\system32\\shutdown.exe\" -r -f -t 0 -c \"Restart Reason\" -d p:4:1";
si.StartInfo.CreateNoWindow = true;
string res = "";
try
{
si.Start();
si.WaitForExit();
res = "Minor Job done... wait 2 minutes to complete action";
}
catch (Exception ex)
{
res= ex.Message;
}
si.Close();
si.Dispose();
return res;
}
для части имени файла и аргумента я также проверил это:
si.StartInfo.FileName = "shutdown.exe";
si.StartInfo.Arguments = "/r /f /t 0 /c \"" + UReason + "\" /d p:4:1";
использование имени файла и аргумента прямо из команды RUN фактически перезагружает компьютер, но в веб-сервисе я получаю эту ошибку:
На рабочем столе сервера: приложение не может быть правильно инициализировано (0xC0000142). Нажмите на кнопку ОК, чтобы закрыть приложение.
В журнале событий у меня есть это:
Process information:
Process ID: 2676
Process name: w3wp.exe
Account name: NT AUTHORITY\NETWORK SERVICE
Exception information:
Exception type: HttpException
Exception message: Request timed out.
Request information:
Request URL: http://mywebsite.com/webservice.asmx
Request path: /webservice.asmx
User host address: <IP Address>
User:
Is authenticated: False
Authentication Type:
Thread account name: NT AUTHORITY\NETWORK SERVICE
Thread information:
Thread ID: 7
Thread account name: NT AUTHORITY\NETWORK SERVICE
Is impersonating: False
В веб-приложении нет ошибок.
Я благодарен, если кто-нибудь скажет мне, как я могу решить эту проблему и дать возможность перезапустить веб-сервис.
1 ответ
Наконец это сработало...
Было множество проблем. Я документирую процесс здесь для дальнейшего использования. Остерегайтесь угроз безопасности.
Благодаря Wjdavis5 я изменил идентификацию Wjdavis5 на локальную систему.
Благодаря запуску командного файла со страницы ASP .NET я удалил несколько строк из кода:
public string DoJob()
{
var si = new Process
{
StartInfo =
{
FileName = "shutdown.exe",
Arguments = "-r -f -t 0 -c "Shutdown Reason" -d p:4:1",
WorkingDirectory = "c:\\windows\\system32\\"
}
};
string res;
try
{
si.Start();
si.WaitForExit();
res = "<br />Minor Job done... wait 2 minutes to complete action<br />You can now close this window";
}
catch (Exception ex)
{
res = ex.Message;
}
si.Close();
si.Dispose();
return res;
}
Чтобы устранить риски безопасности, наряду с некоторыми подходами к безопасности при сокрытии веб-сайта и веб-службы, такими как использование субдомена и нестандартного порта, я использовал олицетворение в небольшом классе C# для олицетворения пользователя пользователем Уве Кеймом, содержимое метода выше, заключенное в этот код:
try
{
using (new Impersonator("Admin Username", ".", "Admin Password"))
{
// Above method Content
.
.
.
}
}
catch (Exception ex)
{
return "Invalid Username or Password";
}
этот код проверяет, действительны ли предоставленные учетные данные на сервере. Я не тестировал неадминистративных пользователей в этом приложении, потому что на этом сервере их нет.
не стесняйтесь комментировать и исправлять. С уважением