如何从 PowerShell 获取 "Terminal Services Profile Path"/CtxWFProfilePath?

How do I get the "Terminal Services Profile Path"/CtxWFProfilePath from PowerShell?

我正在尝试从 AD 中的 Remote Desktop Services Profile 选项卡获取配置文件路径。
我选择了一些用户进行测试,每个用户在该选项卡中都有一个路径。 (下图)

每次我尝试通过 PowerShell 获取此字段时,我都很失望,什么也没得到。

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

谢谢

有任务:

Get-QADuser $user | select TsProfilePath

这个returns一个空字符串

使用 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

找到我需要的但无法解码

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

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

所以我能够在其中看到我需要的东西。其中是文本 CtxWFProfilePath,后面跟着似乎是中文符号的内容。所以现在我的最后一步是解码我所看到的。有人知道怎么做吗?

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

如果您传递用户的 DN,应该可以。

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

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

这是我的 return TS 配置文件路径 的快速而肮脏的 PowerShell 函数。每次都对我有效。

注意:需要任务。此脚本使用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
}

您可以使用它导出到 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