0

我有一个非常奇怪的问题和一个关于可能解决方案的问题。我需要从用 C++ 编写的程序(使用本机 WinAPI)在 Windows 计算机上获取完全限定的专有名称。为此,我使用以下 API:

TCHAR buff[256];
DWORD dwSz = 256;
GetUserNameEx(NameFullyQualifiedDN, buff, &dwSz);

如果我从用户模式进程(从用户桌面)运行上面的代码,它在任何时候都无法工作。但是当我从系统服务调用该 API 时,它不会在 3-4 秒内返回!(我应该说上面的代码可能会在不是 Active Directory 域成员的系统上调用。)

所以我的第一个问题是,为什么从服务调用它会是一个问题?

第二个问题,如果我在我的服务启动时调用该 API,然后将结果缓存在一个全局变量中,然后再使用它,那么该系统上的专有名称发生变化的可能性有多大?

4

1 回答 1

1

如果系统不是域的成员,API 调用将会失败。

当您将其作为本地系统与用户上下文运行时,究竟发生了什么很难说 - 我可能会从网络跟踪开始,看看发生了什么。

我不会假设用户的 DN 是静态的。这是管理员可以随时更改的内容。

添加 DsCrackNames 工作流程:

  1. 调用DsBind- 将 NULL 传递给前两个参数以获取句柄
  2. DsCrackNames使用#1 中的句柄DS_NAME_NO_FLAGSDS_FQDN_1779_NAME、 和计算机名称进行调用。您可能必须在机器名称上附加一个 $。
  3. 打电话DsFreeNameResult这样你就不会泄露结果
  4. 打电话DsUnBind这样你就不会从 #1 泄漏句柄
于 2012-04-18T15:12:06.220 回答