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(集成) 有啥区别