【发布时间】:2018-07-08 05:54:29
【问题描述】:
我有一个 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”,说连接到远程服务器 localhost 失败。 这似乎很正常,因为没有任何东西在等待连接到我的本地主机,而且我不想添加一个。当我像这样实现它时,运行空间可以工作:
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;
}
}
似乎没有实现任何远程连接,即使我们在本地主机中。那么我可以为其他用户添加一些凭据来执行此代码并避免远程连接吗?
【问题讨论】:
-
为什么要以其他用户身份运行它?我经常以另一个用户身份在 PowerShell 中运行命令。这适合你的情况吗?
-
如果我可以通过 C# 传递以避免提示,则可以。事实上,我们有一个普通的用户帐户和一个具有管理员权限的重复帐户。对于几个 PS 脚本,应用程序必须以管理员用户身份执行,因此需要另一个帐户(例如:普通帐户:12aaa,管理员帐户:12aaa-admin)
-
您正在运行的 powershell 脚本的内容是什么?整个脚本必须以其他用户身份运行还是只有特定命令?我想知道您是否可以将凭据推送到 powershell 脚本中并将它们传递给相关 cmdlet 的
-Credentials参数。 -
它只包含一个 RemoveADUser 命令。在这种情况下,整个脚本可以作为另一个用户运行。例如,我可以在 C# 脚本的开头询问并存储密码并将其传递给我的所有 Powershell 脚本,而无需使用 -Credentials 向用户提示任何内容吗?
标签: c# powershell credentials runspace