2014-10-02 2 views
0

Нам нужно было получить информацию в активном каталоге в разделе «Службы терминалов». Для этого я создал функцию, которая отлично работает в большинстве случаев. Однако у некоторых пользователей есть проблемы.PowerShell InvokeGet свойство каталога не найдено

Код:

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 

Я не могу понять, почему он работает на некоторых, а не на всех ..

+0

Похоже, что это происходит только на объектах пользователя, где «Профиль пользователя» пуст и где он никогда не был заполнен раньше. Так сказать, это произойдет только для новых пользователей, у которых нет набора «Профиль пользователя». Нужно выяснить, как достичь пустого результата в этом случае, а не ошибки. – DarkLite1

+0

Очень странно, у меня есть пользователь, где «Разрешить вход в сервер терминалов» отмечен «ВКЛ», но он все еще дает ошибку. Но для некоторых других пользователей, где он также включен, он работает нормально. – DarkLite1

+0

может вам это помочь? http://support.microsoft.com/kb/243440 –

ответ

0

Я работал над недавним проектом, который использует ADSI для установки и чтения атрибутов служб терминалов. Из моего тестирования каждый раз, когда вы выполняете «InvokeGet ({TS Attribute)),« COM-исключение будет вызываться с сообщением «Свойство каталога не может быть найдено в кеше»

Это, похоже, происходит только тогда, когда атрибут userParameters не задано в AD. Может быть, атрибут внутренне проверяет кеш ADSI для userParameters? Таким образом, я имею в виду логически можно проверить DirectoryEntry для userParameters первого, а затем попытаться прочитать свойства, либо установить его, чтобы построить блоб

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, чтобы он был сконструирован.

Смежные вопросы