如何从PowerShell获取"终端服务配置文件路径" / CtxWFProfilePath?

时间:2015-01-13 14:55:49

标签: powershell active-directory user-profile terminal-services

我正在尝试从AD中的Remote Desktop Services Profile标签获取个人资料路径 我挑选了几个用户进行测试,每个用户在该选项卡中都有一个路径。 (下图)

每次我尝试通过PowerShell获取此字段时,我都很失望。

有谁知道什么可能阻止我获得我想要的信息?

谢谢

使用Quest:

Get-QADuser $user | select TsProfilePath

返回空字符串

使用ADSI:

$user = "JBiggs"
$ADUser = Get-qADUser $user | select -ExpandProperty DN
$ADUser = [ADSI]”LDAP://$ADUser”
$ADUser.psbase.InvokeGet(“terminalservicesprofilepath”)

出错

Exception calling "InvokeGet" with "1" argument(s): "Unknown name. (Exception from HRESULT: 0x80020006 (DISP_E_UNKNOWNNAME))"
At line:4 char:25
+ $ADUser.psbase.InvokeGet <<<< (“terminalservicesprofilepath”)
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodException

Picture with the field

找到了我需要但无法解码的内容

事实证明,存储此信息的旧方法是UserParameters值。它存储为base64 blob。当您升级到更新版本的Windows服务器时,旧方法仍在使用,因此我已经存在了很长时间。当发生这种情况时,新字段仍为空白,这是我在上面的一些示例中看到的。

$id = "JXD122"
$User = New-Object DirectoryServices.DirectoryEntry(Get-qADUser $id | select -ExpandProperty Path)
$w.userParameters

所以我能够看到我需要的东西。其中包含文本CtxWFProfilePath,后面是中文符号。所以现在我的最后一步是解码我所看到的。谁知道怎么做?

3 个答案:

答案 0 :(得分:1)

事实证明已升级的旧版DC 保持将此信息存储在UserParameters对象中。由于某种原因,这个对象是愚蠢的编码。

我花了一些时间,但我能够使用以下网站对其进行解码:http://daduke.org/linux/userparameters.html

这是我快速而又脏的PowerShell函数,用于返回 TS配置文件路径。每次都适合我。

注意:需要Quest。此脚本使用get-qADUser命令。为此,您需要安装Quest ActiveDirectory cmdlets

function get-TSPP($id) {
    $enc = [system.Text.Encoding]::UTF8
    $User = New-Object DirectoryServices.DirectoryEntry(Get-qADUser $id | select -ExpandProperty Path)
    $coded = $user.userParameters.tostring().split("")[-1].replace("〰","").replace("CtxWFProfilePath","").ToCharArray()
    $result = @()
    foreach ($c in $coded) {
        $bytes = $enc.GetBytes($c)
        $d = @()
        foreach ($byte in $bytes) {
            $d += [Convert]::ToString($byte, 2) 
        }
        $d = -join $d
        $control_Y = -join $d[4..9]
        $yyyy = -join $d[10..13]
        $control_X = -join $d[14..19]
        $xxxx = -join $d[20..23]

        if ($control_X -eq "011010") {
            $xxxx = [Convert]::ToString([Convert]::ToInt32($xxxx,2) + 9,2)
        }
        if ($control_Y -eq "011010") {
            $yyyy = [Convert]::ToString([Convert]::ToInt32($yyyy,2) + 9,2)
        }

        $binary = @($xxxx, $yyyy)

        $result += [char][Convert]::ToInt32((-join $binary), 2) 
    }

    return -join $result
}

答案 1 :(得分:1)

您可以使用它来导出到c:\ temp \ tspath.csv

Get-ADUser -Filter {enabled -eq "true"}  | ForEach-Object {
   $User = [ADSI]"LDAP://$($_.DistinguishedName)"  
   $User.psbase.InvokeGet(“terminalservicesprofilepath”)  
   } |Out-File C:\temp\tspath.csv

答案 2 :(得分:0)

在ADSI示例中,OU=Users,OU=123,OU=place,OU=state,DC=dc1,DC=NET是一个OU,其基础ADSI对象不实现IADsTSUserEx接口。

如果你传递了用户的DN,它应该可以工作。