Win32 API 日本語リファレンス
ホームSystem.SystemInformation › GetComputerNameExW

GetComputerNameExW

関数
指定した形式でコンピューター名を取得する(Unicode版)。
DLLKERNEL32.dll文字セットUnicode (-W)呼出規約winapiSetLastErrorあり対応OSWindows 2000 以降

シグネチャ

// KERNEL32.dll  (Unicode / -W)
#include <windows.h>

BOOL GetComputerNameExW(
    COMPUTER_NAME_FORMAT NameType,
    LPWSTR lpBuffer,   // optional
    DWORD* nSize
);

パラメーター

名前方向説明
NameTypeCOMPUTER_NAME_FORMATin

取得する名前の種類。このパラメーターは COMPUTER_NAME_FORMAT 列挙型の値です。次の表に追加情報を示します。

意味
ComputerNameDnsDomain
ローカルコンピューターに割り当てられた DNS ドメインの名前。ローカルコンピューターがクラスター内のノードである場合、lpBuffer はクラスター仮想サーバーの DNS ドメイン名を受け取ります。
ComputerNameDnsFullyQualified
ローカルコンピューターを一意に識別する完全修飾 DNS 名。この名前は DNS ホスト名と DNS ドメイン名を組み合わせたもので、HostName.DomainName という形式を取ります。ローカルコンピューターがクラスター内のノードである場合、lpBuffer はクラスター仮想サーバーの完全修飾 DNS 名を受け取ります。
ComputerNameDnsHostname
ローカルコンピューターの DNS ホスト名。ローカルコンピューターがクラスター内のノードである場合、lpBuffer はクラスター仮想サーバーの DNS ホスト名を受け取ります。
ComputerNameNetBIOS
ローカルコンピューターの NetBIOS 名。ローカルコンピューターがクラスター内のノードである場合、lpBuffer はクラスター仮想サーバーの NetBIOS 名を受け取ります。
ComputerNamePhysicalDnsDomain
ローカルコンピューターに割り当てられた DNS ドメインの名前。ローカルコンピューターがクラスター内のノードである場合、lpBuffer はクラスター仮想サーバーの名前ではなく、ローカルコンピューターの DNS ドメイン名を受け取ります。
ComputerNamePhysicalDnsFullyQualified
コンピューターを一意に識別する完全修飾 DNS 名。ローカルコンピューターがクラスター内のノードである場合、lpBuffer はクラスター仮想サーバーの名前ではなく、ローカルコンピューターの完全修飾 DNS 名を受け取ります。

完全修飾 DNS 名は DNS ホスト名と DNS ドメイン名を組み合わせたもので、HostName.DomainName という形式を取ります。

ComputerNamePhysicalDnsHostname
ローカルコンピューターの DNS ホスト名。ローカルコンピューターがクラスター内のノードである場合、lpBuffer はクラスター仮想サーバーの名前ではなく、ローカルコンピューターの DNS ホスト名を受け取ります。
ComputerNamePhysicalNetBIOS
ローカルコンピューターの NetBIOS 名。ローカルコンピューターがクラスター内のノードである場合、lpBuffer はクラスター仮想サーバーの名前ではなく、ローカルコンピューターの NetBIOS 名を受け取ります。
lpBufferLPWSTRoutoptional

コンピューター名またはクラスター仮想サーバー名を受け取るバッファーへのポインター。

DNS はより長い名前を許可するため、名前の長さが MAX_COMPUTERNAME_LENGTH 文字を超える場合があります。このバッファーが十分な大きさであることを保証するには、このパラメーターを NULL に設定し、lpnSize パラメーターで返される必要なバッファーサイズを使用してください。

nSizeDWORD*inout

入力時には、バッファーのサイズを TCHAR 単位で指定します。出力時には、終端の null 文字を含まない、コピー先バッファーにコピーされた TCHAR 数を受け取ります。

バッファーが小さすぎる場合、関数は失敗し、GetLastErrorERROR_MORE_DATA を返します。このパラメーターは、終端の null 文字を含む、必要なバッファーのサイズを受け取ります。

lpBufferNULL の場合、このパラメーターはゼロでなければなりません。

戻り値の型: BOOL

公式ドキュメント

ローカルコンピューターに関連付けられた NetBIOS 名または DNS 名を取得します。これらの名前はシステム起動時に確立され、システムがレジストリから読み取ります。(Unicode)

戻り値

関数が成功した場合、戻り値は 0 以外の値です。

関数が失敗した場合、戻り値はゼロです。拡張エラー情報を取得するには、 GetLastError を呼び出します。考えられる値には次のものがあります。

戻りコード 説明
ERROR_MORE_DATA
lpBuffer バッファーが小さすぎます。lpnSize パラメーターには、名前を受け取るために必要なバイト数が格納されます。

解説(Remarks)

ローカルマシンにグループポリシーが設定されていない場合、 GetComputerNameEx 関数はシステム起動時に確立された NetBIOS 名または DNS 名を取得します。グループポリシーが設定されている場合、関数はグループポリシーによって設定されたプライマリドメイン名を返します。 SetComputerName または SetComputerNameEx 関数による名前の変更は、ユーザーがコンピューターを再起動するまで反映されません。

ローカルコンピューターが DNS 名を使用するように構成されていない場合、GetComputerNameEx は DNS 情報を返しません。これを構成するには、オペレーティングシステムのヘルプに記載された手順に従ってコンピューターのプライマリ DNS サフィックスを変更し、コンピューターを再起動してください。

この関数の動作は、ローカルコンピューターがクラスター内のノードである場合に影響を受けることがあります。詳細については、ResUtilGetEnvironmentWithNetName および UseNetworkName を参照してください。

コンピューターの FQDN がそのドメインの FQDN と一致しない、異なる DNS レイアウトを使用する環境で作業している場合は、代わりに LsaQueryInformationPolicy を使用してください。

この関数を使用するアプリケーションをコンパイルするには、_WIN32_WINNT マクロを 0x0500 以降として定義します。詳細については、 Using the Windows Headers を参照してください。

#define _WIN32_WINNT 0x0500

#include <windows.h>
#include <stdio.h>
#include <tchar.h>

void _tmain(void)
{
    TCHAR buffer[256] = TEXT("");
    TCHAR szDescription[8][32] = {TEXT("NetBIOS"), 
        TEXT("DNS hostname"), 
        TEXT("DNS domain"), 
        TEXT("DNS fully-qualified"), 
        TEXT("Physical NetBIOS"), 
        TEXT("Physical DNS hostname"), 
        TEXT("Physical DNS domain"), 
        TEXT("Physical DNS fully-qualified")};
    int cnf = 0;
    DWORD dwSize = _countof(buffer);
    
    for (cnf = 0; cnf < ComputerNameMax; cnf++)
    {
        if (!GetComputerNameEx((COMPUTER_NAME_FORMAT)cnf, buffer, &dwSize))
        {
            _tprintf(TEXT("GetComputerNameEx failed (%d)\n"), GetLastError());
            return;
        }
        else _tprintf(TEXT("%s: %s\n"), szDescription[cnf], buffer);

        dwSize = _countof(buffer);
        ZeroMemory(buffer, dwSize);
    }
}
メモ

sysinfoapi.h ヘッダーは、UNICODE プリプロセッサ定数の定義に基づいて、この関数の ANSI 版または Unicode 版を自動的に選択するエイリアスとして GetComputerNameEx を定義しています。エンコーディング中立のエイリアスの使用と、エンコーディング中立でないコードを混在させると、不一致が生じ、コンパイルエラーや実行時エラーを引き起こす可能性があります。詳細については、Conventions for Function Prototypes を参照してください。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での呼び出し定義

// KERNEL32.dll  (Unicode / -W)
#include <windows.h>

BOOL GetComputerNameExW(
    COMPUTER_NAME_FORMAT NameType,
    LPWSTR lpBuffer,   // optional
    DWORD* nSize
);
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("KERNEL32.dll", CharSet = CharSet.Unicode, SetLastError = true, ExactSpelling = true)]
static extern bool GetComputerNameExW(
    int NameType,   // COMPUTER_NAME_FORMAT
    [MarshalAs(UnmanagedType.LPWStr)] System.Text.StringBuilder lpBuffer,   // LPWSTR optional, out
    ref uint nSize   // DWORD* in/out
);
<DllImport("KERNEL32.dll", CharSet:=CharSet.Unicode, SetLastError:=True, ExactSpelling:=True)>
Public Shared Function GetComputerNameExW(
    NameType As Integer,   ' COMPUTER_NAME_FORMAT
    <MarshalAs(UnmanagedType.LPWStr)> lpBuffer As System.Text.StringBuilder,   ' LPWSTR optional, out
    ByRef nSize As UInteger   ' DWORD* in/out
) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function
' NameType : COMPUTER_NAME_FORMAT
' lpBuffer : LPWSTR optional, out
' nSize : DWORD* in/out
Declare PtrSafe Function GetComputerNameExW Lib "kernel32" ( _
    ByVal NameType As Long, _
    ByVal lpBuffer As LongPtr, _
    ByRef nSize As Long) As Long
' Unicode(W): 文字列は ByVal As LongPtr とし StrPtr(unicodeStr) を渡す
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

GetComputerNameExW = ctypes.windll.kernel32.GetComputerNameExW
GetComputerNameExW.restype = wintypes.BOOL
GetComputerNameExW.argtypes = [
    ctypes.c_int,  # NameType : COMPUTER_NAME_FORMAT
    wintypes.LPWSTR,  # lpBuffer : LPWSTR optional, out
    ctypes.POINTER(wintypes.DWORD),  # nSize : DWORD* in/out
]
# GetLastError: use ctypes.GetLastError() (or ctypes.WinDLL(use_last_error=True))
require 'fiddle'
require 'fiddle/import'

lib = Fiddle.dlopen('KERNEL32.dll')
GetComputerNameExW = Fiddle::Function.new(
  lib['GetComputerNameExW'],
  [
    Fiddle::TYPE_INT,  # NameType : COMPUTER_NAME_FORMAT
    Fiddle::TYPE_VOIDP,  # lpBuffer : LPWSTR optional, out
    Fiddle::TYPE_VOIDP,  # nSize : DWORD* in/out
  ],
  Fiddle::TYPE_INT)
# Wide strings: pass str.encode("UTF-16LE") + "\x00\x00"
#[link(name = "kernel32")]
extern "system" {
    fn GetComputerNameExW(
        NameType: i32,  // COMPUTER_NAME_FORMAT
        lpBuffer: *mut u16,  // LPWSTR optional, out
        nSize: *mut u32  // DWORD* in/out
    ) -> i32;
}
// crates: windows-sys provides ready-made bindings for this API.
$sig = @"
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("KERNEL32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern bool GetComputerNameExW(int NameType, [MarshalAs(UnmanagedType.LPWStr)] System.Text.StringBuilder lpBuffer, ref uint nSize);
"@
$api = Add-Type -MemberDefinition $sig -Name 'KERNEL32_GetComputerNameExW' -Namespace Win32 -PassThru
# $api::GetComputerNameExW(NameType, lpBuffer, nSize)
#uselib "KERNEL32.dll"
#func global GetComputerNameExW "GetComputerNameExW" wptr, wptr, wptr
; GetComputerNameExW NameType, varptr(lpBuffer), varptr(nSize)   ; 戻り値は stat
; NameType : COMPUTER_NAME_FORMAT -> "wptr"
; lpBuffer : LPWSTR optional, out -> "wptr"
; nSize : DWORD* in/out -> "wptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "KERNEL32.dll"
#cfunc global GetComputerNameExW "GetComputerNameExW" int, var, var
; res = GetComputerNameExW(NameType, lpBuffer, nSize)
; NameType : COMPUTER_NAME_FORMAT -> "int"
; lpBuffer : LPWSTR optional, out -> "var"
; nSize : DWORD* in/out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; BOOL GetComputerNameExW(COMPUTER_NAME_FORMAT NameType, LPWSTR lpBuffer, DWORD* nSize)
#uselib "KERNEL32.dll"
#cfunc global GetComputerNameExW "GetComputerNameExW" int, var, var
; res = GetComputerNameExW(NameType, lpBuffer, nSize)
; NameType : COMPUTER_NAME_FORMAT -> "int"
; lpBuffer : LPWSTR optional, out -> "var"
; nSize : DWORD* in/out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	kernel32 = windows.NewLazySystemDLL("KERNEL32.dll")
	procGetComputerNameExW = kernel32.NewProc("GetComputerNameExW")
)

// NameType (COMPUTER_NAME_FORMAT), lpBuffer (LPWSTR optional, out), nSize (DWORD* in/out)
r1, _, err := procGetComputerNameExW.Call(
	uintptr(NameType),
	uintptr(lpBuffer),
	uintptr(nSize),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // BOOL
function GetComputerNameExW(
  NameType: Integer;   // COMPUTER_NAME_FORMAT
  lpBuffer: PWideChar;   // LPWSTR optional, out
  nSize: Pointer   // DWORD* in/out
): BOOL; stdcall;
  external 'KERNEL32.dll' name 'GetComputerNameExW';
result := DllCall("KERNEL32\GetComputerNameExW"
    , "Int", NameType   ; COMPUTER_NAME_FORMAT
    , "Ptr", lpBuffer   ; LPWSTR optional, out
    , "Ptr", nSize   ; DWORD* in/out
    , "Int")   ; return: BOOL
●GetComputerNameExW(NameType, lpBuffer, nSize) = DLL("KERNEL32.dll", "bool GetComputerNameExW(int, char*, void*)")
# 呼び出し: GetComputerNameExW(NameType, lpBuffer, nSize)
# NameType : COMPUTER_NAME_FORMAT -> "int"
# lpBuffer : LPWSTR optional, out -> "char*"
# nSize : DWORD* in/out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
# ※-W(Unicode)関数。なでしこ1はANSIのため -A 版の利用を推奨。
const std = @import("std");

extern "kernel32" fn GetComputerNameExW(
    NameType: i32, // COMPUTER_NAME_FORMAT
    lpBuffer: [*c]u16, // LPWSTR optional, out
    nSize: [*c]u32 // DWORD* in/out
) callconv(std.os.windows.WINAPI) i32;
// Unicode(-W): UTF-16LE のヌル終端バッファ([*c]const u16)を渡す。
proc GetComputerNameExW(
    NameType: int32,  # COMPUTER_NAME_FORMAT
    lpBuffer: ptr uint16,  # LPWSTR optional, out
    nSize: ptr uint32  # DWORD* in/out
): int32 {.importc: "GetComputerNameExW", stdcall, dynlib: "KERNEL32.dll".}
# Unicode(-W): WideCString は newWideCString("...") で生成。
pragma(lib, "kernel32");
extern(Windows)
int GetComputerNameExW(
    int NameType,   // COMPUTER_NAME_FORMAT
    wchar* lpBuffer,   // LPWSTR optional, out
    uint* nSize   // DWORD* in/out
);
ccall((:GetComputerNameExW, "KERNEL32.dll"), stdcall, Int32,
      (Int32, Ptr{UInt16}, Ptr{UInt32}),
      NameType, lpBuffer, nSize)
# NameType : COMPUTER_NAME_FORMAT -> Int32
# lpBuffer : LPWSTR optional, out -> Ptr{UInt16}
# nSize : DWORD* in/out -> Ptr{UInt32}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
# Unicode(-W): Cwstring には transcode(UInt16, "...") 等で UTF-16 を渡す。
local ffi = require("ffi")
ffi.cdef[[
int32_t GetComputerNameExW(
    int32_t NameType,
    uint16_t* lpBuffer,
    uint32_t* nSize);
]]
local kernel32 = ffi.load("kernel32")
-- kernel32.GetComputerNameExW(NameType, lpBuffer, nSize)
-- NameType : COMPUTER_NAME_FORMAT
-- lpBuffer : LPWSTR optional, out
-- nSize : DWORD* in/out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
-- Unicode(-W): uint16_t* には UTF-16LE のバッファ(ffi.new("uint16_t[?]", ...))を渡す。
const koffi = require('koffi');
const lib = koffi.load('KERNEL32.dll');
const GetComputerNameExW = lib.func('__stdcall', 'GetComputerNameExW', 'int32_t', ['int32_t', 'uint16_t *', 'uint32_t *']);
// GetComputerNameExW(NameType, lpBuffer, nSize)
// NameType : COMPUTER_NAME_FORMAT -> 'int32_t'
// lpBuffer : LPWSTR optional, out -> 'uint16_t *'
// nSize : DWORD* in/out -> 'uint32_t *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("KERNEL32.dll", {
  GetComputerNameExW: { parameters: ["i32", "buffer", "pointer"], result: "i32" },
});
// lib.symbols.GetComputerNameExW(NameType, lpBuffer, nSize)
// NameType : COMPUTER_NAME_FORMAT -> "i32"
// lpBuffer : LPWSTR optional, out -> "buffer"
// nSize : DWORD* in/out -> "pointer"
// 文字列は "buffer"。Unicode(-W) は new TextEncoder() ではなく UTF-16LE のバイト列(末尾に \x00\x00)を Uint8Array で渡す。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
int32_t GetComputerNameExW(
    int32_t NameType,
    uint16_t* lpBuffer,
    uint32_t* nSize);
C, "KERNEL32.dll");
// $ffi->GetComputerNameExW(NameType, lpBuffer, nSize);
// NameType : COMPUTER_NAME_FORMAT
// lpBuffer : LPWSTR optional, out
// nSize : DWORD* in/out
// 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
// WINAPI(stdcall): x64 では呼出規約が統一されるため問題なし。x86 では __stdcall 対応のラッパが必要な場合あり。
import com.sun.jna.*;
import com.sun.jna.ptr.*;
import com.sun.jna.win32.StdCallLibrary;
import com.sun.jna.win32.W32APIOptions;

public interface Kernel32 extends StdCallLibrary {
    Kernel32 INSTANCE = Native.load("kernel32", Kernel32.class, W32APIOptions.UNICODE_OPTIONS);
    boolean GetComputerNameExW(
        int NameType,   // COMPUTER_NAME_FORMAT
        char[] lpBuffer,   // LPWSTR optional, out
        IntByReference nSize   // DWORD* in/out
    );
}
// Unicode(-W): WString(入力)/char[](出力)で UTF-16 をマーシャリング。
@[Link("kernel32")]
lib LibKERNEL32
  fun GetComputerNameExW = GetComputerNameExW(
    NameType : Int32,   # COMPUTER_NAME_FORMAT
    lpBuffer : UInt16*,   # LPWSTR optional, out
    nSize : UInt32*   # DWORD* in/out
  ) : Int32
end
# 構造体/GUID/enum は lib 内に対応する型定義が必要。
# 呼出規約: x64 は規約統一のため OK。x86(32bit)は WINAPI=stdcall だが Crystal の fun に stdcall 付与構文がなく非対応。
import 'dart:ffi';
import 'package:ffi/ffi.dart';

typedef GetComputerNameExWNative = Int32 Function(Int32, Pointer<Utf16>, Pointer<Uint32>);
typedef GetComputerNameExWDart = int Function(int, Pointer<Utf16>, Pointer<Uint32>);
final GetComputerNameExW = DynamicLibrary.open('KERNEL32.dll')
    .lookupFunction<GetComputerNameExWNative, GetComputerNameExWDart>('GetComputerNameExW');
// NameType : COMPUTER_NAME_FORMAT -> Int32
// lpBuffer : LPWSTR optional, out -> Pointer<Utf16>
// nSize : DWORD* in/out -> Pointer<Uint32>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function GetComputerNameExW(
  NameType: Integer;   // COMPUTER_NAME_FORMAT
  lpBuffer: PWideChar;   // LPWSTR optional, out
  nSize: Pointer   // DWORD* in/out
): BOOL; stdcall;
  external 'KERNEL32.dll' name 'GetComputerNameExW';
import Foreign
import Foreign.C.Types
import Foreign.C.String

foreign import stdcall safe "GetComputerNameExW"
  c_GetComputerNameExW :: Int32 -> CWString -> Ptr Word32 -> IO CInt
-- NameType : COMPUTER_NAME_FORMAT -> Int32
-- lpBuffer : LPWSTR optional, out -> CWString
-- nSize : DWORD* in/out -> Ptr Word32
-- 要 GHC(Windows)。stdcall は x64 では ccall として扱われる。ブロックする API は safe 呼び出し推奨。
open Ctypes
open Foreign

let getcomputernameexw =
  foreign "GetComputerNameExW"
    (int32_t @-> (ptr uint16_t) @-> (ptr uint32_t) @-> returning int32_t)
(* NameType : COMPUTER_NAME_FORMAT -> int32_t *)
(* lpBuffer : LPWSTR optional, out -> (ptr uint16_t) *)
(* nSize : DWORD* in/out -> (ptr uint32_t) *)
(* foreign は cdecl 前提。x64 Windows では WINAPI と一致。構造体は ctypes structure を定義のこと。 *)
(cffi:define-foreign-library kernel32 (t "KERNEL32.dll"))
(cffi:use-foreign-library kernel32)

(cffi:defcfun ("GetComputerNameExW" get-computer-name-ex-w :convention :stdcall) :int32
  (name-type :int32)   ; COMPUTER_NAME_FORMAT
  (lp-buffer :pointer)   ; LPWSTR optional, out
  (n-size :pointer))   ; DWORD* in/out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $GetComputerNameExW = Win32::API::More->new('KERNEL32',
    'BOOL GetComputerNameExW(int NameType, LPWSTR lpBuffer, LPVOID nSize)');
# my $ret = $GetComputerNameExW->Call($NameType, $lpBuffer, $nSize);
# NameType : COMPUTER_NAME_FORMAT -> int
# lpBuffer : LPWSTR optional, out -> LPWSTR
# nSize : DWORD* in/out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。
# Unicode(-W): LPCWSTR/LPWSTR は Win32::API が UTF-16 変換を行う。

関連項目

文字セット違い
公式の関連項目
使用する型