Powershell-传入并执行字符串而不使用WinRM

Powershell-传入并执行字符串而不使用WinRM,powershell,Powershell,我正在尝试使用一个自定义PS函数,该函数将接受powershell命令作为字符串参数,并将结果执行/存储在函数本身的变量中,以供以后引用。在做了一些研究之后,我找到了一种方法,将“Get WinEvent”作为字符串变量传递给函数,然后在函数中将该变量转换为脚本块,如下所示: $PowershellQueryScript=[Scriptblock]::创建($PowershellQuery) 一旦我这样做了,我在我的foreach循环中调用了变量,并按如下方式存储结果: $myResults=I

我正在尝试使用一个自定义PS函数,该函数将接受powershell命令作为字符串参数,并将结果执行/存储在函数本身的变量中,以供以后引用。在做了一些研究之后,我找到了一种方法,将“Get WinEvent”作为字符串变量传递给函数,然后在函数中将该变量转换为脚本块,如下所示:

$PowershellQueryScript=[Scriptblock]::创建($PowershellQuery)

一旦我这样做了,我在我的foreach循环中调用了变量,并按如下方式存储结果:

$myResults=Invoke命令-ComputerName$server-ScriptBlock$PowershellQueryScript

现在,我收到的错误与未启用WinRM有关(“连接到远程服务器myServer失败,出现以下错误消息:WinRM无法处理请求”)。不幸的是,我认为不允许在生产环境中更改此设置。如果我不使用Invoke命令直接从服务器->生产中调用此命令,那么一切都会按预期工作,因为我认为它不必在远程服务器上创建远程PS会话,因此不需要WinRM


是否有其他解决方法允许用户使用字符串调用我的函数,并在函数本身中执行该字符串,而无需启用WinRM?

经过进一步研究,我发现WinRM已经启用,并且已经配置了正确的防火墙设置。问题是我使用的是cnames,而不是FQDNs(完全限定域名),因此DNS无法正确解析。通过将cname转换为可以解决的值来解决问题:

$ServerFQDN = [System.Net.Dns]::GetHostEntry([string]$ServerCname).HostName

使用DCOM身份验证。Powershell远程处理默认为WinRM。为什么不启用WinRM?prod服务器上的设置更改需要批准,因此即使更改很小,我也不必进行更改。另外,我认为PS远程处理是一种安全风险,因此需要进一步检查。编辑:看起来它在默认情况下处于启用状态,但不确定在运行命令时出现问题的原因(如果是这种情况)。我知道RPC调用可以工作,但不能这样做,而且仍然使用我的PS函数()您可以使用DCOM,但正如您所说,它在默认情况下是启用的。可能是服务未启动。“默认情况下,公共配置文件的WinRM防火墙例外限制对同一本地子网内远程计算机的访问。”您可以通过运行
test WSMan
来测试WinRM是否在本地和/或远程计算机上运行。我相信最好的方法是在一个组织中启用WS-Man,只要您查看该组织的安全文档,就像您在上文中已经开始做的那样。这与您环境中的任何其他连接一样具有很大的风险-您可以通过限制对一组端点的访问、要求凭据并实施良好的凭据管理来缓解这些风险。它比另一种选择要好,即人们询问解决方法,做一些会产生安全风险的事情,或者使用PSExec等工具。