PowerShell InvokeGet无法找到目录属性

时间:2014-10-02 12:26:46

标签: powershell

我们需要检索有关'终端服务的活动目录中的信息。为此我创造了一个在大多数时候都能正常工作的功能。但是,对于一些用户,我们遇到了问题。

代码:

Function Get-ADTSProfile {
               [CmdletBinding()]
            Param(
                [Parameter(Mandatory=$true,Position=0)]
                [String] $DistinguishedName,
                [parameter(Mandatory=$true,Position=1)]
                [ValidateNotNullOrEmpty()]
                [ValidateSet('UserProfile','AllowLogon','HomeDirectory','HomeDrive')]
                [String]$Property
            )
            Begin {
                $User = [ADSI]"LDAP://$DistinguishedName"
            }
            Process {
                Switch ($Property) {
                    'AllowLogon'    {if ($($User.psbase.InvokeGet('allowLogon')) -eq '1'){$True}else{$False}}
                    'HomeDirectory' {$User.psbase.InvokeGet('TerminalServicesHomeDirectory')}
                    'HomeDrive'     {$User.psbase.InvokeGet('TerminalServicesHomeDrive')}
                    'UserProfile'   {$User.psbase.InvokeGet('TerminalServicesProfilePath')}
                }   
            }
        }

错误:

Get-ADTSProfile -DistinguishedName 'CN=test\, test (Den Bosch) NLD,OU=Users,OU=Disabled,OU=NLD,OU=EU,DC=domain,DC=net' -Property 'UserProfile'
Exception calling "InvokeGet" with "1" argument(s): "The directory property cannot be fo
und in the cache.
"
At S:\Test\Brecht\Testie.ps1:84 char:38
+                     'UserProfile'   {$User.psbase.InvokeGet('TerminalServicesPro ...
+                                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodTargetInvocation

我无法弄清楚为什么它适用于某些而不是所有......

1 个答案:

答案 0 :(得分:0)

我一直致力于最近使用ADSI设置和读取终端服务属性的项目。从我的测试中随时执行“InvokeGet({TS Attribute})”将抛出一个COM异常,并显示消息“无法在缓存中找到目录属性”

只有在AD中未设置“userParameters”属性时才会出现这种情况。也许该属性在内部检查ADSI缓存中的userParameters?所以我在逻辑上思考你可以先检查DirectoryEntry的userParameters,然后尝试读取属性,或者设置它来构造blob

if ($user.Properties.Contains("userParameters"))
{
 #Read the Property from ADSI
 Write-Host $user.InvokeGet("TerminalServicesProfilePath")
} else {
 #Set the property to construct the userParameter blob
 $user.InvokeSet("TerminalServicesProfilePath", "\\somepath")
 $user.CommitChanges()
}

即使没有设置userParameters属性,你仍然可以执行一个InvokeSet来构建它