Em C++/Windows, como obtenho o nome da rede do computador em que estou?
-
08-06-2019 - |
Pergunta
Em um aplicativo C++ Windows (XP e NT, se isso fizer diferença) em que estou trabalhando, preciso obter o nome da rede associado ao computador em que o código está sendo executado, para poder converter nomes de arquivos locais de C:\ nome do arquivo.ext para \ ome_da_rede\C$ omedoarquivo.ext.Como eu faria isso?
Alternativamente, se houver uma função que faça apenas a conversão que descrevi, seria ainda melhor.Pesquisei WNetGetUniversalName, mas parece que não funciona com arquivos locais (unidade C).
Solução
Você vai querer o GetComputerName do Win32:
http://msdn.microsoft.com/en-us/library/ms724295(VS.85).aspx
Outras dicas
Existem mais de uma alternativa:
a.Use GetComputerName() do Win32 conforme sugerido por Stu.
Exemplo: http://www.techbytes.ca/techbyte97.html
OU
b.Use a função gethostname() no Winsock.Esta função é multiplataforma e pode ajudar se seu aplicativo for executado em outras plataformas além do Windows.
Referência MSDN: http://msdn.microsoft.com/en-us/library/ms738527(VS.85).aspx
OU
c.Use a função getaddrinfo().
Referência MSDN: http://msdn.microsoft.com/en-us/library/ms738520(VS.85).aspx
Concordo com Pascal em usar a função gethostname() do Winsock.Aqui você vai:
#include <winsock2.h> //of course this is the way to go on windows only
#pragma comment(lib, "Ws2_32.lib")
void GetHostName(std::string& host_name)
{
WSAData wsa_data;
int ret_code;
char buf[MAX_PATH];
WSAStartup(MAKEWORD(1, 1), &wsa_data);
ret_code = gethostname(buf, MAX_PATH);
if (ret_code == SOCKET_ERROR)
host_name = "unknown";
else
host_name = buf;
WSACleanup();
}
Se você quiser apenas o nome do computador local (NetBIOS), use GetComputerName
função.Ele recupera apenas o nome do computador local estabelecido na inicialização do sistema, quando o sistema o lê no registro.
BOOL WINAPI GetComputerName(
_Out_ LPTSTR lpBuffer,
_Inout_ LPDWORD lpnSize
);
Mais sobre ObterNomeDoComputador
Se você deseja obter o nome do host DNS, o nome de domínio DNS ou o nome DNS totalmente qualificado, ligue para o GetComputerNameEx
função.
BOOL WINAPI GetComputerNameEx(
_In_ COMPUTER_NAME_FORMAT NameType,
_Out_ LPTSTR lpBuffer,
_Inout_ LPDWORD lpnSize
);
Mais sobre ObterNomeDoComputadorEx