Оба пользователя учетные записи имеют доступ к папке на диске C:\, к папке под названием Tools. В Tools есть единственное приложение HelloWorld.exe, которое просто печатает «Hello World!». в командную строку и завершает работу (новое стандартное консольное приложение).
Когда я запускаю конечную точку API, которая не переключается на учетную запись домена, выходные данные следующего вызова API имеют вид
Код: Выделить всё
[HttpGet("api/v1/test/noContextSwitchingTest")]
public async Task NoContextSwitchingTest() {
var prInfo = new ProcessStartInfo {
FileName = @"C:\tools\helloworld.exe",
Arguments = "",
ErrorDialog = false,
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
CreateNoWindow = true,
};
var stdout = new StringBuilder();
var stderr = new StringBuilder();
using (System.Diagnostics.Process proc = new()) {
proc.StartInfo = prInfo;
proc.EnableRaisingEvents = true;
proc.ErrorDataReceived += (sender, errorLine) => { if (errorLine.Data != null) stderr.AppendLine(errorLine.Data); };
proc.OutputDataReceived += (sender, outputLine) => { if (outputLine.Data != null) stdout.AppendLine(outputLine.Data); };
proc.Start();
proc.BeginErrorReadLine();
proc.BeginOutputReadLine();
proc.WaitForExit();
}
return Ok(new { Out = stdout.ToString(), Erro = stderr.ToString() });
}
Код: Выделить всё
{ "out": "Hello, World!\r\n", "erro": "" }
Код: Выделить всё
[HttpGet("api/v1/test/WithContextSwitchingTest")]
public async Task WithContextSwitchingTest() {
var prInfo = new ProcessStartInfo {
FileName = @"C:\tools\helloworld.exe",
Arguments = "",
ErrorDialog = false,
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
CreateNoWindow = true,
};
prInfo.UserName = "domain-account-with-different-access";
prInfo.PasswordInClearText = "PASSWORD";
var stdout = new StringBuilder();
var stderr = new StringBuilder();
using (System.Diagnostics.Process proc = new()) {
proc.StartInfo = prInfo;
proc.EnableRaisingEvents = true;
proc.ErrorDataReceived += (sender, errorLine) => { if (errorLine.Data != null) stderr.AppendLine(errorLine.Data); };
proc.OutputDataReceived += (sender, outputLine) => { if (outputLine.Data != null) stdout.AppendLine(outputLine.Data); };
proc.Start();
proc.BeginErrorReadLine();
proc.BeginOutputReadLine();
proc.WaitForExit();
}
return Ok(new { Out = stdout.ToString(), Erro = stderr.ToString() });
}
Код: Выделить всё
Application popup: HelloWorld.exe - Application Error : The application was unable to start correctly (0xc0000142). Click OK to close the application.
Код: Выделить всё
{
"out": "",
"erro": ""
}
Если я переключу пул приложений на запуск от имени учетной записи домена в IIS и повторно запущу конечную точку без переключения контекста, HelloWorld работает нормально, поэтому я знаю, что учетная запись домена может запустить исполняемый файл и получить к нему доступ.
Мне нужен совет по другому коду, который можно использовать, или областям, представляющим интерес для безопасности. это может помешать переключению.
Подробнее здесь: https://stackoverflow.com/questions/786 ... executable