我正在尝试编写一个PS脚本来pipe理AD对象,方法是连接到DC并使用Get-ADUser(以及其他某些其他cmdlet)检索信息。 我使用以下PS代码连接到DC:
$global:MyDC = ($env:LOGONSERVER -replace "\\", "") + ".domain.com" $ADsession = New-PSSession -computerName $global:MyDC Invoke-Command -Session $ADsession -Command {Import-Module -Name ActiveDirectory} Import-PSSession -session $ADsession -module ActiveDirectory -Prefix RM
像这样的工程(所以我的PS Remoting似乎是确定的):
$strUsersOU = "CN=UserOU,DC=domain,DC=com" $strResourcesOU = "OU=Resources," + $strUsersOU $strSharedOU = "OU=Shared," + $strUsersOU [array]$arrADusers = @(Get-RMADUser -Filter * -SearchBase $strUsersOU -Properties DisplayName, AccountExpirationDate, lockedout, passwordexpired, enabled | Where-Object {($_.DistinguishedName -NotMatch $strSharedOU) -And ($_.DistinguishedName -NotMatch $strResourcesOU)} | sort DisplayName | select DisplayName, lockedout, passwordexpired, enabled, @{Name='AccountExpirationDate';Expression={$_.AccountExpirationDate.ToString('D')}}, DistinguishedName)
在使用Get-RMADUser和本地variables作为filterexpression式的一部分时(我正在过滤AD专有名称属性),我遇到了一个问题。 我做了一些与上面的数组(加载到DGV等)的东西(根据用户在DGV中select什么)我检索DN,然后使用它来从AD检索用户信息与这样的东西(这似乎在使用本地AD PS模块时工作正常):
(是的,我查询下面的命令所有属性邻接我需要返回他们 – 即使他们是空值)
$global:objSelectedADuserInfo = Get-ADUser -Filter { DistinguishedName -eq $strSelectedUserDN } -SearchBase $strUsersOU -Properties *, departmentNumber, extensionAttribute1, employeeID, msExchHideFromAddressLists, "msDS-UserPasswordExpiryTimeComputed"
如果我切换上面的命令来使用PS Remoting,我得到的错误与filter脚本块(改变Get-ADUser从上面的代码到Get-RMADUser。Get-RMADUser的作品,如果我不使用filter,我已经走了通过一个千字节的文章今天(一些在StackExchange)关于如何使这项工作(所以我不会发布我得到的所有不同的错误,而是我只是张贴代码,我已经尝试过)。我确定我现在正在努力寻找,以至于我忽略了一些简单的东西,我尝试过使用如下的东西:
(切换到)
$using:strSelectedUserDN
(我试过类似的东西)
$ScriptBlockFilter = [scriptblock]::Create("DistinguishedName -eq $strSelectedUserDN")
然后将$ ScriptBlockFiltervariables传递给它:
Get-RMADUser -Filter $ScriptBlockFilter -SearchBase …
(然后像这样:)
Invoke-Command -Session $ADsession -ArgumentList $strSelectedUserDN -ScriptBlock {param ($strSelectedUserDN) Get-RMADUser -Filter { DistinguishedName -eq $strSelectedUserDN } -SearchBase …
(以及上述所有的各种组合)。 仍然没有运气,无论我尝试做什么,我都无法得到这个工作。 基本上,是否有可能得到像这样的一个命令(下面)与远程PS会话一起工作? 在这个线程的开始处使用上述命令,我是否正确连接到远程DC? 我错过了什么(或弄乱了)? 做这样的事情最好的(适当的)方法是什么?
$global:objSelectedADuserInfo = Get-RMADUser -Filter { DistinguishedName -eq $strSelectedUserDN } -SearchBase $strUsersOU -Properties *, departmentNumber, extensionAttribute1, employeeID, msExchHideFromAddressLists, "msDS-UserPasswordExpiryTimeComputed"
非常感谢您的帮助
我用这个代码来重现你的情况:
$ADPSSession = New-PSSession -ComputerName 2008r2esxi2 Invoke-Command -Session $ADPSSession -Command { Import-Module ActiveDirectory } Import-PSSession -Session $ADPSSession -Module ActiveDirectory -Prefix RM
然后我想尝试一个string-Filter的参数,尝试了这个,并得到一个错误:
$LocalSam = 'joakimbs' $x = Get-RMADUser -Filter "SamAccountName -eq $LocalSam" -Properties * Error parsing query: 'SamAccountName -eq joakimbs' Error Message: 'syntax error' at position: '20'. + CategoryInfo : ParserError: (:) [Get-ADUser], ADFilterParsingException
然后我记得最近遇到了AD cmdlet使用string和“脚本块”的特殊语法(显然它们并不是真正的脚本块)。
如果感兴趣的话(我认为它比[ScriptBlock] :: Create()更清洁),我在variables周围添加了单引号,然后它就起作用了:
$x = Get-RMADUser -Filter "SamAccountName -eq '$LocalSam'" -Properties * $x.DistinguishedName CN=joakimbs,CN=Users,DC=svendsen,DC=local
我希望我不会违背任何规则(再次)。 我正在回答这个问题,但主要是为了给未来的读者补充信息。 我是否应该对此作出评论?
我觉得我也应该提到[char] 34的东西是不必要的。 你可以把双引号放在双引号string的双引号中,或者使用PowerShell转义字符(`)来转义双引号。
使用脚本块仍然允许你跳过字符转换(一个脚本块没有像我理解的那样完全处理,但仍然被接受为-Filter参数的types)。
这似乎是在这篇微软文章中解释的。
这是一个使用单引号代替[script] :: Create()的[char] 34的例子。
$SB = [ScriptBlock]::Create("SamAccountName -eq '$LocalSam'") $SB.ToString() SamAccountName -eq 'joakimbs' $x = Get-RMADUser -Filter $SB -Properties * $x.DistinguishedName CN=joakimbs,CN=Users,DC=svendsen,DC=local [char] 34 "
希望对某人有帮助。
那么,经过更多的尝试和错误,我得到了它的工作:
$ScriptBlockFilter = [scriptblock]::Create("DistinguishedName -eq " + [char]34 + $strCurrentlySelectedUserDN + [char]34) $global:objSelectedADuserInfo = (Get-RMADUser -Filter $ScriptBlockFilter -SearchBase $strUsersOU -Properties *, departmentNumber, extensionAttribute1, employeeID, msExchHideFromAddressLists, "msDS-UserPasswordExpiryTimeComputed")
这个问题(最初testing脚本块方法时)是因为Get-RMADuserfilter查询需要在远程端引用过滤AD以获取专有名称(并且在扩展variables时通过嵌套脚本块发送引号不起作用) 。 因此,通过在扩展variables的每一边添加[char] 34,在将命令发送到远程PS会话之前,将扩展variables的引号括起来。 我也改变了命令的括号。 而一旦我做了这些事情,它的工作(有点)。
然后(在一个侧面说明),我遇到了一个问题,因为空的AD属性没有从远程PS会话返回(不pipe我怎么试着让它工作)。 当我使用Get-ADUser (本地AD模块)时,它返回空属性(我在Get-ADUser命令中明确指定),但是使用远程PS会话, Get-RMADuser没有返回像这样的空AD属性当使用本地AD模块时。 将其与设置(在我的PS脚本中)相结合:
Set-StrictMode -Version latest
当脚本尝试访问远程PS会话中对象属性中不存在的属性(即使我尝试显式查询它)时,这种情况一直持续导致我的脚本不断出错。 当我使用本地AD模块进行testing时,该对象就存在,而不是使用远程PS会话。 因此,在整个脚本中,我必须添加一个validationtesting(如下面的示例),以确保在尝试访问脚本之前存在属性。
if ($global:objSelectedADuserInfo.PSObject.Properties['employeeID']) { Blah, blah }
在使用远程PS会话时要记住一些事情。 无论如何,现在当使用远程PS会话来查询AD使用局部variables的可分辨名称(或其他filter)时,所有东西都可以正常工作。
干杯!! 🙂