Vistaでコンピュータ名を取得するには


りゅういち  2008-10-23 07:25:27  No: 69142

VC6+MFCで開発しています。

Vistaでコンピュータ名を取得しているのですが
うまくいきません。
15バイト目で切り捨てられてしまいます。

うまく取得できないコンピュータ名は
「コンピュータ管理者アドミン」
というような日本語を含んでおり、
「コンピュータ管」で切り捨てられています。

正確に取得するにはどのようにすればいいのでしょうか?
分かる方いましたら、ご教授よろしくお願いします。

※以下ソースコード
//char name[MAX_COMPUTERNAME_LENGTH + 1];
char name[1000];
DWORD size = sizeof(name);

memset(name, '\0', size);

::GetComputerName(name, &size);


とおりすg  2008-10-23 09:05:52  No: 69143

まず前提として、GetComputerNameで取得できるのは「NetBIOS名」なのね。
んで、NetBIOS名は15バイトで切り捨てられる。この辺は実際に自分のPCで
16バイト以上のコンピュータ名を設定してみると、その時点でNetBIOS名は
15文字で切り捨てられてるのがわかる(XPでは確認済み、Vistaは未確認)。
  ※マイコンピュータのプロパティ→コンピュータ名→変更→詳細

じゃあ16文字以上のコンピュータ名はどーすんだ?ということでMSDN見てみると
http://msdn.microsoft.com/ja-jp/library/cc429732.aspx
GetComputerNameExならDNSホスト名を取得できるとあるので試してみる。

//test.cpp
#include <windows.h>

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
  { //GetComputerNameA()・・・NG
    char name[1000 + 1] = ""; //確認のため大きめにする
    DWORD length = (sizeof name) / (sizeof name[0]);
    ::GetComputerNameA(name, &length);

    ::OutputDebugStringA(name);
    ::OutputDebugStringA("\r\n");
  }

  { //GetComputerNameExA()・・・NG
    char name[1000 + 1] = ""; //確認のため大きめにする
    DWORD length = (sizeof name) / (sizeof name[0]);
    ::GetComputerNameExA(ComputerNameDnsHostname, name, &length);

    ::OutputDebugStringA(name);
    ::OutputDebugStringA("\r\n");
  }

  { //GetComputerNameExW()・・・OK
    wchar_t name[1000 + 1] = L""; //確認のため大きめにする
    DWORD length = (sizeof name) / (sizeof name[0]);
    ::GetComputerNameExW(ComputerNameDnsHostname, name, &length);

    ::OutputDebugStringW(name);
    ::OutputDebugStringW(L"\r\n");
  }

  { //GetComputerNameW()・・・NG
    wchar_t name[1000 + 1] = L""; //確認のため大きめにする
    DWORD length = (sizeof name) / (sizeof name[0]);
    ::GetComputerNameW(name, &length);

    ::OutputDebugStringW(name);
    ::OutputDebugStringW(L"\r\n");
  }

  return 0;
}

---結果---
コンピュータ管
コンピュータ管
コンピュータ管理者アドミン
コンピュータ管

まず、GetComputerNameを確認(1つ目)。
次にGetComputerNameExを確認。ANSI版(2つ目)だとなぜか半分で切れる。
なんでだろ。Unicode版だときちんと取れる(3つ目)。
ん?ならGetComputerNameもUnicode版なら取れたり・・・しないね(4つ目)。

ってことで、16文字以上のコンピュータ名が欲しいならGetComputerNameExWで
DNSホスト名を取得するのが正解ぽい。


どら  2008-10-23 22:17:26  No: 69144

WMIを使ってWin32_ComputerSystemあたりから情報を取る手もあるかと。
とおりすgさんの案のようにスマートなソースにはなりにくいですが・・・
WMIを勉強するいい機会かも(笑)?
     ↑普通使わないですね(私は頻繁に使ってますが・・・)

参考URL: http://msdn.microsoft.com/en-us/library/aa390423(VS.85).aspx

私なら、日本語や長いコンピュータ名はつけないような運用にする方を優先し
ますけどね☆


とおりすg  2008-10-25 03:09:37  No: 69145

> WMIを使ってWin32_ComputerSystemあたりから情報を取る手もあるかと。
ああ、なるほど。今ならそっちが真っ当なアプローチか。
システム情報としての「コンピュータ名」が欲しいならどら氏のやり方が
いいね。フォローありがとう。
COMで、しかもリファレンスが英語だから経験無い人だと涙目だけど。

> 私なら、日本語や長いコンピュータ名はつけないような運用にする方を優先し
> ますけどね☆
同感。でも何も知らない人はけっこう平気で日本語のクソ長い名前付け
るんだよね。ウチの客もフツーに付けてたし。
NetBIOS/DNS的に問題ないのかな???

・・・タブインデント消えててソース見づらいね。ごめん。orz


ななし  2008-10-26 04:33:35  No: 69146

茶化すつもりはないけど、
>運用で何とかしろ
と言うのはどらさんの質問を見るたびにほぼ毎回思ってますよ・・・


どら  2008-10-27 21:33:52  No: 69147

ななしさん

私のスレの批判は、私のスレに書き込んでください。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加