Как запустить сценарий PowerShell от имени администратора с политикой и областью действияC#

Место общения программистов C#
Ответить
Anonymous
 Как запустить сценарий PowerShell от имени администратора с политикой и областью действия

Сообщение Anonymous »

Я очень плохо разбираюсь в PowerShell и новичок. Мне нужно с полученным запросом запустить сценарий powershell. Мой запрос и ответ, который мне нужен, выглядит так:

Код: Выделить всё

public class MyRequest
{
public string Script { get; set; }             // PowerShell script content
public string Policy { get; set; }             // e.g. "Bypass", "RemoteSigned"
public string Scope { get; set; }              // e.g. "Process", "CurrentUser"
public bool RunAsAdmin { get; set; }           // true = elevated
public int TimeoutInSeconds { get; set; }      // timeout duration
}

public class PowerShellResult
{
public int ExitCode { get; set; }
public string Output { get; set; }
public string Error { get; set; }
}
Я использую библиотеку CliWrap.
Теперь моя проблема в том, что мне нужно запустить скрипт от имени администратора, если он установлен в запросе.
Я пробовал все, даже ChatGPT в конце.
Когда я устанавливаю запуск без прав администратора, он запускается, но когда я настроен как администратор, консоль пуста.
Это мой пример кода.

Код: Выделить всё

using CliWrap;
using CliWrap.Buffered;
using System.Text;

var runner = new PowerShellRunner();
var result =  await runner.RunAsync(new MyRequest
{
Script = "Write-Output 'Hello from PowerShell'",
Policy = "Restricted",
Scope = "Process",
RunAsAdmin = true,
TimeoutInSeconds = 30
});

Console.WriteLine($"PowerShell script execution completed with code: {result.ExitCode}.");
Console.WriteLine($"Errors: {result.Error}.");
Console.WriteLine($"Output: {result.Output}.");
Console.ReadKey();

public class MyRequest
{
public string Script { get; set; }             // PowerShell script content
public string Policy { get; set; }             // e.g. "Bypass", "RemoteSigned"
public string Scope { get; set; }              // e.g.  "Process", "CurrentUser"
public bool RunAsAdmin { get; set; }           // true = elevated
public int TimeoutInSeconds { get; set; }      // timeout duration
}

public class PowerShellResult
{
public int ExitCode { get; set; }
public string Output { get; set; }
public string Error { get; set; }
}

public class PowerShellRunner
{
public async Task
 RunAsync(MyRequest request)
{
var errors = new StringBuilder();
var output = new StringBuilder();

using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(request.TimeoutInSeconds));

try
{
if (request.RunAsAdmin)
{
// Launch elevated PowerShell
string elevateArgs =
$"-NoProfile -ExecutionPolicy {request.Policy} '{request.Script}'";

string elevateCommand =
$"Start-Process powershell -Verb RunAs -ArgumentList \"{elevateArgs}\"";

Console.WriteLine($"Command: {elevateCommand}");

var result = await Cli.Wrap("powershell")
.WithArguments(a => a.Add("-NoProfile").Add("-Command").Add(elevateCommand))
.WithValidation(CommandResultValidation.None)
.WithStandardOutputPipe(PipeTarget.ToStringBuilder(output))
.WithStandardErrorPipe(PipeTarget.ToStringBuilder(errors))
.ExecuteBufferedAsync(cts.Token);

return new PowerShellResult
{
ExitCode = result.ExitCode,
Output = output.ToString(),
Error = errors.ToString()
};
}
else
{
// Normal PowerShell run
var result = await Cli.Wrap("powershell")
.WithArguments(a => a
.Add("-NoProfile")
.Add("-ExecutionPolicy").Add(request.Policy)
.Add(request.Script))
.WithValidation(CommandResultValidation.None)
.WithStandardOutputPipe(PipeTarget.ToStringBuilder(output))
.WithStandardErrorPipe(PipeTarget.ToStringBuilder(errors))
.ExecuteBufferedAsync(cts.Token);

return new PowerShellResult
{
ExitCode = result.ExitCode,
Output = output.ToString(),
Error = errors.ToString()
};
}
}
}
}
спасибо


Подробнее здесь: https://stackoverflow.com/questions/797 ... -and-scope
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»