Учетные данные 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 которое даст вам подробное представление о хранении учетных данных.
КР Гюнтер