Учетные данные Runspace Powershell

У меня есть скрипт Powershell, который я хочу запустить на C# от имени другого пользователя.

Вот код для вызова сценария ps из текущего сеанса:

using (PowerShell PowerShellInstance = PowerShell.Create())
{
    PowerShellInstance.AddScript(RemoveUser);
    PowerShellInstance.AddParameter("GID", GID);
    try
    {
        PowerShellInstance.Invoke();
        return true;
    }
    catch (Exception e)
    {
        Debug.WriteLine(e.StackTrace);
    }
    return false;
}

Этот код работает отлично. Но теперь я хочу выполнить его как другой пользователь. Я видел много примеров кода, говорящих о WSManConnectionInfo, поэтому я попробовал этот фрагмент кода, найденный в другом вопросе:

var password = new SecureString();
Array.ForEach("myStup1dPa$$w0rd".ToCharArray(), password.AppendChar);
PSCredential credential = new PSCredential("anotherUser", password);
WSManConnectionInfo connectionInfo = new WSManConnectionInfo() { Credential = credential };

using (Runspace runspace = RunspaceFactory.CreateRunspace(connectionInfo))
{
    runspace.Open();
    using (PowerShell PowerShellInstance = PowerShell.Create())
    {
        PowerShellInstance.Runspace = runspace;
        PowerShellInstance.AddScript(RemoveUser);
        PowerShellInstance.AddParameter("GID", GID);
        try
        {
            PowerShellInstance.Invoke();
            return true;
        }
        catch (Exception e)
        {
            Debug.WriteLine(e.StackTrace);
        }
        return false;
    }
}

Но в тот момент, когда я добавляю WSManConnectionInfo, я получаю "PSRemotingTransportException", в котором говорится, что подключение к локальному хосту удаленного сервера не удалось. Это кажется нормальным, потому что ничего не ждет подключения к моему локальному хосту, и я не хочу добавлять его. Runspace работает, когда я реализую это так:

using (Runspace runspace = RunspaceFactory.CreateRunspace())
{
    runspace.Open();
    using (PowerShell PowerShellInstance = PowerShell.Create())
    {
        PowerShellInstance.Runspace = runspace;
        PowerShellInstance.AddScript(RemoveUser);
        PowerShellInstance.AddParameter("GID", GID);
        try
        {
            PowerShellInstance.Invoke();
            return true;
        }
        catch (Exception e)
        {
            Debug.WriteLine(e.StackTrace);
        }
        return false;
    }
}

Кажется, что никакого удаленного подключения не реализовано, даже если мы находимся в localhost. Так я могу просто добавить некоторые учетные данные для другого пользователя, чтобы выполнить этот код и избежать удаленного подключения?

1 ответ

Вы можете сохранить учетную переменную в файле XML, используя следующее:

$credential = Get-Credential
$credential | Export-Clixml -Path C:\path\to\credential.xml

Выполните это с normal account, Только normal account сможет загрузить учетные данные с помощью следующей команды:

$credential = Import-Clixml -Path C:\path\to\credential.xml

После загрузки вы можете выполнить командлет как

Remove-ADUser -Identity GlenJohn -Credential $credential -Confirm:$false

Если другой пользователь пытается импортировать файл, отображается следующая ошибка:

Import-Clixml : Key not valid for use in specified state.

Я рекомендую вам посмотреть видео https://www.youtube.com/watch?v=Ta2hQHVKauo которое даст вам подробное представление о хранении учетных данных.

КР Гюнтер

Другие вопросы по тегам