我正在尝试从AD中的Remote Desktop Services Profile
标签获取个人资料路径
我挑选了几个用户进行测试,每个用户在该选项卡中都有一个路径。 (下图)
每次我尝试通过PowerShell获取此字段时,我都很失望。
有谁知道什么可能阻止我获得我想要的信息?
谢谢
Get-QADuser $user | select TsProfilePath
返回空字符串
$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
,后面是中文符号。所以现在我的最后一步是解码我所看到的。谁知道怎么做?
答案 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,它应该可以工作。