我有一个非常奇怪的问题和一个关于可能的解决方案的问题。我需要在Windows计算机上从使用C ++编写的程序(使用本机WinAPI)获得完全限定的专有名称。为此,我使用以下API:
TCHAR buff[256];
DWORD dwSz = 256;
GetUserNameEx(NameFullyQualifiedDN, buff, &dwSz);
如果我从用户模式进程(从用户桌面)运行它,上面的代码可以立即工作。但是当我从系统服务调用该API时,它不会返回3-4秒! (我应该说上面的代码可能在不是Active Directory域成员的系统上调用。)
所以我的第一个问题是,为什么从服务中调用它是一个问题?
第二个问题,如果我在服务启动时调用该API,然后将结果缓存到全局变量中,然后再使用它,那么可分辨名称在该系统上发生了哪些变化?
答案 0 :(得分:1)
如果系统不是域的成员,则API调用将失败。
当您将本地系统与用户上下文运行时正好发生的事情很难说 - 我可能会从网络跟踪开始,看看发生了什么。
我不会假设用户的DN是静态的。这是管理员可以随时更改的内容。
添加DsCrackNames工作流程:
DsBind
- 将NULL传递给前两个参数以获取句柄DsCrackNames
,DS_NAME_NO_FLAGS
和计算机名称的句柄呼叫DS_FQDN_1779_NAME
。您可能需要在机器名称上附加$。DsFreeNameResult
,以免泄露结果DsUnBind
,这样就不会泄漏#1