我目前使用
WTSQueryUserConfig
来检索AD用户的所有终端服务属性,例如
"tsIntialProgram", "tsWorkingDir", "tsInheritInitialProgram","tsAllowLogon", "tsTimeOutSettingsConnections", "tsTimeOutSettingsDisConnections", "tsShadowSettings","tsServerRemoteHomeDir",....
但对于数百个用户而言,这需要花费大量时间。
似乎所有终端服务属性信息都存储在
userParameters
AD 属性中,并且由于它是编码的,所以不是可读的形式。如果有任何 C++ API 可以解析该属性中存在的所有终端服务属性信息并以可读形式返回,那就太好了。
使用 LDAP C++ 检索 AD 用户所有终端服务属性的最快方法是什么?还有其他API吗? (只对C++感兴趣,对Powershell或其他语言不感兴趣)
看起来
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
);