我正在尝试枚举我们本地域中的终端服务器,但WTSEnumerateServers()失败,错误代码为1212(指定域名的格式无效。)。我尝试使用子域名“ sub”,完整域名“ sub.company.local”和NULL(它是计算机域的同义词)进行尝试。总是一样。
MSDN Article指出:如果禁用NetBT,此功能将不起作用。
NetBT是基于TCP / IP的NetBIOS。我检查了默认情况下该功能是打开的。我正在使用Windows 8.1

有谁知道为什么WTSEnumerateServers()失败?

#include <stdio.h>
#include <Wtsapi32.h>
#include <Windows.h>

#pragma comment(lib, "Wtsapi32.lib")

void LastErrorMsgBox(int err);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
  PWTS_SERVER_INFO DiscoveredServers = NULL;
  DWORD count = 0;

  if(WTSEnumerateServers(NULL, 0, 1, &DiscoveredServers, &count) == 0)
  {
    LastErrorMsgBox(GetLastError());
    return 1;
  }
  WTSFreeMemory(DiscoveredServers);
  return 0;
}

void LastErrorMsgBox(int err)
{
  TCHAR  dbg[1024];
  LPTSTR sys = NULL;
  _stprintf(dbg, TEXT("Errorcode: %d\n"), err);
  FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&sys, 0, NULL);
  _tcsncat(dbg, sys, 1024);
  if(sys != NULL)
    LocalFree(sys);
  MessageBox(0, dbg, TEXT("Error"), MB_ICONERROR);
}

最佳答案

我搜索了一下,发现以下here


  / ***************************************************** ***************
  * 请注意:
  * WTSEnumerateServers函数在Windows 2008中不再起作用。
  * WTSEnumerateServers函数依赖于NETBIOS才能在
  *域。 Windows 2008服务器在禁用计算机浏览器服务
  *现在默认情况下是DC,因此Netbios变得无用。启用电脑
  *仅DC上的浏览器服务将返回WTSAPI的全部功能
  * 功能。这是一个很好的解决方法,但是正如微软所说,他们将
  *将来不再支持Netbios,我确定我们将不得不修改我们的
  * TS环境中的开发策略。为了记录,那些
  *使用NETSERVEREnum函数与WTSEnumerateServers相同,这
  *还需要在Windows 2008 DC上启用计算机浏览器服务。
  * Citrix WFAPI SDK也是这种情况-WFEnumerateServers
  *
  *我找到的最好的替代方法是WNetOpenEnum()。
  *
  ****************************************************** ************* /


也许WNetOpenEnum 也会帮助您。

09-13 04:26