Powershell v3.0 管道问题

Posted

技术标签:

【中文标题】Powershell v3.0 管道问题【英文标题】:Powershell v3.0 pipe issue 【发布时间】:2012-10-22 22:44:48 【问题描述】:

我在使用这个命令时遇到了问题:

gc .\domains.txt | Get-ADDomain

顾名思义,domains.txt 包含要查询的 Active Directory 列表(所有域都在同一个林中)。

如果我在我的 Windows 8 机器上运行它,一切正常,我得到预期的结果,而不是在带有 WMF 3.0 的 Windows 2008 R2 SP1 成员服务器(不是 DC)上,我只从列表中的第一个域获得结果对于其他人:

Get-ADDomain : A referral was returned from the server

如果我查询列表中的域:

Get-ADDomain <Domain name here>

效果很好。

我的工作站

Microsoft Windows 8 企业版 (6.2.9200) x64

PS D:\Tools\Powershell> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      3.0
WSManStackVersion              3.0
SerializationVersion           1.1.0.1
CLRVersion                     4.0.30319.18010
BuildVersion                   6.2.9200.16384
PSCompatibleVersions           1.0, 2.0, 3.0
PSRemotingProtocolVersion      2.2

服务器

Microsoft Windows Server 2008 R2 Standard SP1 (6.1.7601) x64

PS C:\Tools\Powershell> $PSVersionTable

Name                           Value
----                           -----
WSManStackVersion              3.0
PSCompatibleVersions           1.0, 2.0, 3.0
SerializationVersion           1.1.0.1
BuildVersion                   6.2.9200.16398
PSVersion                      3.0
CLRVersion                     4.0.30319.269
PSRemotingProtocolVersion      2.2

更新

如果我在服务器上运行:

gc .\domains.txt | % Get-ADDomain $_ 

运行良好

追踪

trace-command -Name ParameterBinding  "DOMAIN_1","DOMAIN_2" | Get-ADDomain  -PSHost

服务器:http://pastebin.com/sRVJHaCU

工作站:http://pastebin.com/kj3JV6nV

提前致谢

【问题讨论】:

第一个域(它在 Server 2008 R2 中运行)是该服务器所属的域吗? 不,服务器属于返回错误的域(使用管道) 您是否仔细检查了文本文件(行尾没有特殊字符,unicode/ansi 不匹配)? 尝试使用 Trace-Command 来查看参数绑定是如何失败的,例如trace-command -Name ParameterBinding gc .\domains.txt | Get-ADDomain -PSHost 来自服务器的跟踪:pastebin.com/sRVJHaCU 来自工作站的跟踪:pastebin.com/kj3JV6nV 似乎 ActiveDirectory 模块在服务器上运行不正常。实际上两台机器指向不同的DNS;我会尝试使用相同的 DNS 服务器。 【参考方案1】:

Powershell v3.0 pipe issue

我刚刚尝试运行 cmdlet 'gc .\text.txt |从我拥有的虚拟 Server 2008 R2 框中获取-ADDomain'。我用以下格式构建了一个文本文件:

 Domain1
 Domain2
 Domain3

要确定的一点是,每个域在文本文件中都位于其自己的行中。我可以理解为什么当您将 STDOUT 传送到以下位置时,一种语法会起作用:

% Get-ADDomain $_ 

因为您正在遍历文本文件中包含的所有信息,并且一次只能让 cmdlet 处理一个值。不幸的是,我的 Win 8 桌面上没有 RSAT 包,所以我无法从我的桌面上进行测试。希望这会有所帮助。

【讨论】:

【参考方案2】:

我找到了一篇可能有帮助的文章。

http://technet.microsoft.com/en-us/library/ee617224.aspx

从脚本的外观来看,您正在使用文本文件提供服务器。问题是否可能是您运行 PowerShell 脚本的 Windows 2008 服务器不在同一个域中,或者您登录的用户无权访问其他服务器所属的域?

来自上述文章的sn-p:

-如果指定了Server参数而没有指定Credential参数: -- 将域设置为指定服务器的域,并且 cmdlet 检查以确保该服务器位于指定服务器的域中 LocalComputer 或 LoggedOnUser。然后是当前的凭据 登录用户用于获取域。时返回错误 服务器不在 LocalComputer 或 LoggedOnUser 的域中。

您可以尝试为 Get-ADDomain 命令行开关添加其他参数,例如 -Identity、-AuthType 和 -Credential

获取-ADDomain [-Identity] [-AuthType | ] [-Credential ] [-Server ] []

【讨论】:

你是对的,服务器已加入域,我正在尝试获取森林中其他域的信息,但我仍然不明白为什么 gc .\domains.txt | % Get-ADDomain $_ 有效,而 gc .\domains.txt | Get-ADDomain 没有。

以上是关于Powershell v3.0 管道问题的主要内容,如果未能解决你的问题,请参考以下文章

更改 Powershell 会话的当前文化,特定于 v3.0+

PowerShell ISE:调试从 power-shell 脚本调用的另一个 power-shell 脚本

万网虚拟主机版本 .NET Framework V2.0/V3.0/V3.5(经典) .NET Framework V2.0/V3.0/V3.5(集成) 有啥区别

如何在 Power BI 部署管道中添加“UAT”阶段?

理解Powershell管道

“创建管道时出错。”在 Azure 管道自托管代理中运行 powershell 脚本时