Javascript New PSSession未返回要导入和使用的会话

Javascript New PSSession未返回要导入和使用的会话,javascript,c#,powershell,Javascript,C#,Powershell,我可能这样做是错误的,应该改用WSManConnectionInfo,但我发现的许多示例都指向这种方法,即在C#app中以不同凭据创建新的PowerShell会话作为有效方法 我一直使用调用新PSSession的部分,因为它不返回会话对象(返回空集合),我可以在下一组命令中使用它。我的目标是创建一个C#函数,该函数接受PowerShell脚本块并使用管理员凭据运行它 (更新)下面的代码现在可以工作了。请确保为客户端计算机名称选中“Enable WSManCredSSP”参数,否则在创建新PSSe

我可能这样做是错误的,应该改用WSManConnectionInfo,但我发现的许多示例都指向这种方法,即在C#app中以不同凭据创建新的PowerShell会话作为有效方法

我一直使用调用新PSSession的部分,因为它不返回会话对象(返回空集合),我可以在下一组命令中使用它。我的目标是创建一个C#函数,该函数接受PowerShell脚本块并使用管理员凭据运行它

(更新)下面的代码现在可以工作了。请确保为客户端计算机名称选中“Enable WSManCredSSP”参数,否则在创建新PSSession时将无法委派凭据。我更改了代码,使客户端使用本地计算机名,而域中的所有客户端使用*名称,我认为使用*是一种糟糕的安全做法

    public static IEnumerable<PSObject> RunScriptBlock(string block)
    {
        var nc = Domains.Default.GetNetworkCredential();
        var creds = new PSCredential(nc.Domain + "\\" + nc.UserName, nc.SecurePassword);
        using (Runspace rs = RunspaceFactory.CreateRunspace())
        {

            rs.Open();
            using (var psh = PowerShell.Create())
            {
                psh.Runspace = rs;
                PSSession session = null;
                try
                {
                    psh.AddCommand("Enable-WSManCredSSP");
                    psh.AddParameter("Role", "Client");
                    psh.AddParameter("DelegateComputer", Environment.MachineName + ".mydomain.com");
                    psh.AddParameter("Force", true);
                    psh.Invoke();
                    psh.Commands.Clear();
                    psh.AddCommand("Enable-WSManCredSSP");
                    psh.AddParameter("Role", "Server");
                    psh.AddParameter("Force", true);
                    psh.Invoke();
                    psh.Commands.Clear();
                    psh.AddCommand("New-PSSession");
                    psh.AddParameter("Credential", creds);
                    psh.AddParameter("Authentication", "Credssp");
                    session = psh.Invoke()[0].BaseObject as PSSession;
                    psh.Commands.Clear();
                    psh.Runspace.SessionStateProxy.SetVariable("", "");
                    psh.AddCommand("Invoke-Command");
                    psh.AddParameter("Session", session);
                    ScriptBlock sb = new RunspaceInvoke().Invoke("{ " + block + " }")[0].BaseObject as ScriptBlock;
                    psh.AddParameter("ScriptBlock", sb);
                    var results = psh.Invoke();
                    //if (results.HasErrors)
                    //{

                    //}
                    return results;
                }
                catch (Exception)
                {
                    return null;
                }
                finally
                {
                    psh.Commands.Clear();
                    psh.AddCommand("Remove-PSSession");
                    psh.AddParameter("Session", session);
                    psh.Invoke();
                    rs.Close();
                }
            }
        }
    }
公共静态IEnumerable RunScriptBlock(字符串块)
{
var nc=Domains.Default.GetNetworkCredential();
var creds=新的PSCredential(nc.Domain+“\\”+nc.UserName,nc.SecurePassword);
使用(Runspace rs=RunspaceFactory.CreateRunspace())
{
rs.Open();
使用(var psh=PowerShell.Create())
{
psh.运行空间=rs;
PSSession session=null;
尝试
{
psh.AddCommand(“启用WSManCredSSP”);
psh.AddParameter(“角色”、“客户”);
AddParameter(“DelegateComputer”,Environment.MachineName+”.mydomain.com);
psh.AddParameter(“力”,真);
调用();
psh.Commands.Clear();
psh.AddCommand(“启用WSManCredSSP”);
psh.AddParameter(“角色”、“服务器”);
psh.AddParameter(“力”,真);
调用();
psh.Commands.Clear();
psh.AddCommand(“新PSSession”);
psh.AddParameter(“凭证”,creds);
psh.AddParameter(“身份验证”、“Credssp”);
session=psh.Invoke()[0]。BaseObject作为PSSession;
psh.Commands.Clear();
SessionStateProxy.SetVariable(“,”);
psh.AddCommand(“调用命令”);
psh.AddParameter(“会话”,会话);
ScriptBlock sb=new RunspaceInvoke().Invoke(“{+block+”}”)[0]。BaseObject作为ScriptBlock;
psh.AddParameter(“脚本块”,sb);
var results=psh.Invoke();
//if(results.HasErrors)
//{
//}
返回结果;
}
捕获(例外)
{
返回null;
}
最后
{
psh.Commands.Clear();
psh.AddCommand(“删除PSSession”);
psh.AddParameter(“会话”,会话);
调用();
rs.Close();
}
}
}
}

那么它会返回什么?空的收藏?包含其他内容的集合?是的,它返回一个空集合。如果我添加$env:username,它将返回我当前的ID。只有在
New PSSession
失败时,它才会发出
PSSession
对象。检查
psh.haderors
psh.Streams.Error
Mathias,你就是那个人。出现错误,原因是未将Enable WSManCredSSP cmd设置为正确的客户端。我更改了它,使其无法为域中的所有计算机启用。我会发布一个更新。然后它会返回什么?空的收藏?包含其他内容的集合?是的,它返回一个空集合。如果我添加$env:username,它将返回我当前的ID。只有在
New PSSession
失败时,它才会发出
PSSession
对象。检查
psh.haderors
psh.Streams.Error
Mathias,你就是那个人。出现错误,原因是未将Enable WSManCredSSP cmd设置为正确的客户端。我更改了它,使其无法为域中的所有计算机启用。我会发布更新。