获取AD用户所有终端服务属性

问题描述 投票:0回答:1

我目前使用

WTSQueryUserConfig
来检索AD用户的所有终端服务属性,例如

"tsIntialProgram", "tsWorkingDir", "tsInheritInitialProgram","tsAllowLogon", "tsTimeOutSettingsConnections", "tsTimeOutSettingsDisConnections", "tsShadowSettings","tsServerRemoteHomeDir",....

但对于数百个用户而言,这需要花费大量时间。

似乎所有终端服务属性信息都存储在

userParameters
AD 属性中,并且由于它是编码的,所以不是可读的形式。如果有任何 C++ API 可以解析该属性中存在的所有终端服务属性信息并以可读形式返回,那就太好了。

使用 LDAP C++ 检索 AD 用户所有终端服务属性的最快方法是什么?还有其他API吗? (只对C++感兴趣,对Powershell或其他语言不感兴趣)

c++ active-directory ldap windows-server terminal-services
1个回答
0
投票

看起来

NetpParmsQueryUserProperty()
中的
netapi32.dll
函数可以解析属性字符串,
UsrPropGetValue()
中的
regapi.dll
也可以。

虽然 LDAP 中的值看起来是一个二进制 blob,但实际上必须首先将其解码为 UTF-8 string 到 wchar 数组中,然后从那里它是一个 相当简单的结构列表(感谢 MS仍然在 Microsoft GitHub 上保留 Microsoft Windows 源代码)——尽管令人困惑的是,长度以字节为单位(不是 wchar 单位),并且虽然名称存储为 wchar[length/2],但属性值必须被强制转换回来到 char[] ,结果发现它是一个十六进制编码的 ASCII 字符串...但我设法从 Python 解析它,所以从 C++ 中解析它应该更简单。

整个事情似乎是 20 世纪 90 年代初 Novell NetWare 时代的遗物,这也许可以解释它的粗鲁。

NTSTATUS
NetpParmsQueryUserProperty (
    IN  LPWSTR          UserParms,
    IN  LPWSTR          PropertyName,
    OUT PWCHAR          PropertyFlag,
    OUT PUNICODE_STRING PropertyValue
    );

NTSTATUS
NetpParmsQueryUserPropertyWithLength (
    IN  PUNICODE_STRING UserParms,
    IN  LPWSTR          PropertyName,
    OUT PWCHAR          PropertyFlag,
    OUT PUNICODE_STRING PropertyValue
    );

NTSTATUS
UsrPropGetValue(
    TCHAR *pValueName,
    PVOID pValue,
    ULONG ValueLength,
    WCHAR *pUserParms
    );
© www.soinside.com 2019 - 2024. All rights reserved.