PowerShell InvokeGet 找不到目录属性 [英] PowerShell InvokeGet the directory property cannot be found

查看:53
本文介绍了PowerShell InvokeGet 找不到目录属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们需要在活动目录中检索有关终端服务"的信息.为此,我创建了一个在大多数情况下都能正常工作的函数.但是,对于某些用户,我们遇到了问题.

We needed to retrieve the information in active directory concerning 'Terminal Services'. For this I've created a function that works fine most of the time. However, with some users we have issues.

代码:

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

我真的不明白为什么它适用于某些而不适用于所有..

I can't really figure out why it works on some and not on all..

推荐答案

我最近从事一个使用 ADSI 设置和读取终端服务属性的项目.根据我的测试,无论何时您执行InvokeGet({TS Attribute})",都会抛出 COM 异常并显示消息在缓存中找不到目录属性"

I've been working on a recent project that uses ADSI to set and read Terminal Services attributes. From my testing anytime you perform a "InvokeGet({TS Attribute})" a COM exception will be thrown with the message "The directory property cannot be found in cache"

这似乎只有在 AD 中未设置userParameters"属性时才会发生.也许属性在内部检查用户参数的 ADSI 缓存?所以我在逻辑上认为你可以先检查 DirectoryEntry 的 userParameters,然后尝试读取属性,或者将其设置为构造 blob

This seems to occur only when the "userParameters" attribute is not set in AD. Maybe the attribute internally checks the ADSI cache for userParameters? So i'm thinking logically you could check the DirectoryEntry for userParameters first, then try and read the properties, or else set it to construct the 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 来构造它

Even if the userParameters attribute is not set, you can still perform an InvokeSet to have it constructed

这篇关于PowerShell InvokeGet 找不到目录属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆