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

GetComputerNameExA

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

シグネチャ

// KERNEL32.dll  (ANSI / -A)
#include <windows.h>

BOOL GetComputerNameExA(
    COMPUTER_NAME_FORMAT NameType,
    LPSTR 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 名が格納されます。
lpBufferLPSTRoutoptional

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

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

nSizeDWORD*inout

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

バッファーが小さすぎる場合、関数は失敗し、GetLastErrorERROR_MORE_DATA を返します。このパラメーターには、終端の NULL 文字を含めて必要なバッファーのサイズが格納されます。

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

戻り値の型: BOOL

公式ドキュメント

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

戻り値

関数が成功すると、戻り値は 0 以外の値になります。

関数が失敗すると、戻り値は 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 を定義します。エンコーディング中立のエイリアスの使用と、エンコーディング中立でないコードを混在させると、コンパイルエラーや実行時エラーを引き起こす不一致が生じる可能性があります。詳細については、関数プロトタイプの規則を参照してください。

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

各言語での呼び出し定義

// KERNEL32.dll  (ANSI / -A)
#include <windows.h>

BOOL GetComputerNameExA(
    COMPUTER_NAME_FORMAT NameType,
    LPSTR lpBuffer,   // optional
    DWORD* nSize
);
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("KERNEL32.dll", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
static extern bool GetComputerNameExA(
    int NameType,   // COMPUTER_NAME_FORMAT
    [MarshalAs(UnmanagedType.LPStr)] System.Text.StringBuilder lpBuffer,   // LPSTR optional, out
    ref uint nSize   // DWORD* in/out
);
<DllImport("KERNEL32.dll", CharSet:=CharSet.Ansi, SetLastError:=True, ExactSpelling:=True)>
Public Shared Function GetComputerNameExA(
    NameType As Integer,   ' COMPUTER_NAME_FORMAT
    <MarshalAs(UnmanagedType.LPStr)> lpBuffer As System.Text.StringBuilder,   ' LPSTR optional, out
    ByRef nSize As UInteger   ' DWORD* in/out
) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function
' NameType : COMPUTER_NAME_FORMAT
' lpBuffer : LPSTR optional, out
' nSize : DWORD* in/out
Declare PtrSafe Function GetComputerNameExA Lib "kernel32" ( _
    ByVal NameType As Long, _
    ByVal lpBuffer As String, _
    ByRef nSize As Long) As Long
' VBA7前提(PtrSafe)。32bit Office では LongPtr→Long。Integer=16bit / Long=32bit / LongLong=64bit。
import ctypes
from ctypes import wintypes

GetComputerNameExA = ctypes.windll.kernel32.GetComputerNameExA
GetComputerNameExA.restype = wintypes.BOOL
GetComputerNameExA.argtypes = [
    ctypes.c_int,  # NameType : COMPUTER_NAME_FORMAT
    wintypes.LPSTR,  # lpBuffer : LPSTR 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')
GetComputerNameExA = Fiddle::Function.new(
  lib['GetComputerNameExA'],
  [
    Fiddle::TYPE_INT,  # NameType : COMPUTER_NAME_FORMAT
    Fiddle::TYPE_VOIDP,  # lpBuffer : LPSTR optional, out
    Fiddle::TYPE_VOIDP,  # nSize : DWORD* in/out
  ],
  Fiddle::TYPE_INT)
#[link(name = "kernel32")]
extern "system" {
    fn GetComputerNameExA(
        NameType: i32,  // COMPUTER_NAME_FORMAT
        lpBuffer: *mut u8,  // LPSTR 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.Ansi, SetLastError = true)]
public static extern bool GetComputerNameExA(int NameType, [MarshalAs(UnmanagedType.LPStr)] System.Text.StringBuilder lpBuffer, ref uint nSize);
"@
$api = Add-Type -MemberDefinition $sig -Name 'KERNEL32_GetComputerNameExA' -Namespace Win32 -PassThru
# $api::GetComputerNameExA(NameType, lpBuffer, nSize)
#uselib "KERNEL32.dll"
#func global GetComputerNameExA "GetComputerNameExA" sptr, sptr, sptr
; GetComputerNameExA NameType, varptr(lpBuffer), varptr(nSize)   ; 戻り値は stat
; NameType : COMPUTER_NAME_FORMAT -> "sptr"
; lpBuffer : LPSTR optional, out -> "sptr"
; nSize : DWORD* in/out -> "sptr"
; ※HSP3.7は #func のため戻り値はシステム変数 stat に格納されます。
出力引数:
#uselib "KERNEL32.dll"
#cfunc global GetComputerNameExA "GetComputerNameExA" int, var, var
; res = GetComputerNameExA(NameType, lpBuffer, nSize)
; NameType : COMPUTER_NAME_FORMAT -> "int"
; lpBuffer : LPSTR optional, out -> "var"
; nSize : DWORD* in/out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
出力引数:
; BOOL GetComputerNameExA(COMPUTER_NAME_FORMAT NameType, LPSTR lpBuffer, DWORD* nSize)
#uselib "KERNEL32.dll"
#cfunc global GetComputerNameExA "GetComputerNameExA" int, var, var
; res = GetComputerNameExA(NameType, lpBuffer, nSize)
; NameType : COMPUTER_NAME_FORMAT -> "int"
; lpBuffer : LPSTR optional, out -> "var"
; nSize : DWORD* in/out -> "var"
; ※出力/バッファ引数は var 方式(変数を直接渡す)。varptr 方式にも切替可。
import (
	"golang.org/x/sys/windows"
	"unsafe"
)

var (
	kernel32 = windows.NewLazySystemDLL("KERNEL32.dll")
	procGetComputerNameExA = kernel32.NewProc("GetComputerNameExA")
)

// NameType (COMPUTER_NAME_FORMAT), lpBuffer (LPSTR optional, out), nSize (DWORD* in/out)
r1, _, err := procGetComputerNameExA.Call(
	uintptr(NameType),
	uintptr(lpBuffer),
	uintptr(nSize),
)
_ = err  // syscall.Errno (valid when the call sets last-error)
_ = r1   // BOOL
function GetComputerNameExA(
  NameType: Integer;   // COMPUTER_NAME_FORMAT
  lpBuffer: PAnsiChar;   // LPSTR optional, out
  nSize: Pointer   // DWORD* in/out
): BOOL; stdcall;
  external 'KERNEL32.dll' name 'GetComputerNameExA';
result := DllCall("KERNEL32\GetComputerNameExA"
    , "Int", NameType   ; COMPUTER_NAME_FORMAT
    , "Ptr", lpBuffer   ; LPSTR optional, out
    , "Ptr", nSize   ; DWORD* in/out
    , "Int")   ; return: BOOL
●GetComputerNameExA(NameType, lpBuffer, nSize) = DLL("KERNEL32.dll", "bool GetComputerNameExA(int, char*, void*)")
# 呼び出し: GetComputerNameExA(NameType, lpBuffer, nSize)
# NameType : COMPUTER_NAME_FORMAT -> "int"
# lpBuffer : LPSTR optional, out -> "char*"
# nSize : DWORD* in/out -> "void*"
# なでしこ1は32bit・ANSI(Shift_JIS)。文字列=char*(ANSI)、ポインタ/ハンドル=void*(4byte)。
const std = @import("std");

extern "kernel32" fn GetComputerNameExA(
    NameType: i32, // COMPUTER_NAME_FORMAT
    lpBuffer: [*c]u8, // LPSTR optional, out
    nSize: [*c]u32 // DWORD* in/out
) callconv(std.os.windows.WINAPI) i32;
proc GetComputerNameExA(
    NameType: int32,  # COMPUTER_NAME_FORMAT
    lpBuffer: ptr char,  # LPSTR optional, out
    nSize: ptr uint32  # DWORD* in/out
): int32 {.importc: "GetComputerNameExA", stdcall, dynlib: "KERNEL32.dll".}
pragma(lib, "kernel32");
extern(Windows)
int GetComputerNameExA(
    int NameType,   // COMPUTER_NAME_FORMAT
    char* lpBuffer,   // LPSTR optional, out
    uint* nSize   // DWORD* in/out
);
ccall((:GetComputerNameExA, "KERNEL32.dll"), stdcall, Int32,
      (Int32, Ptr{UInt8}, Ptr{UInt32}),
      NameType, lpBuffer, nSize)
# NameType : COMPUTER_NAME_FORMAT -> Int32
# lpBuffer : LPSTR optional, out -> Ptr{UInt8}
# nSize : DWORD* in/out -> Ptr{UInt32}
# stdcall は 32bit のみ意味を持つ(x64 では無視)。
local ffi = require("ffi")
ffi.cdef[[
int32_t GetComputerNameExA(
    int32_t NameType,
    char* lpBuffer,
    uint32_t* nSize);
]]
local kernel32 = ffi.load("kernel32")
-- kernel32.GetComputerNameExA(NameType, lpBuffer, nSize)
-- NameType : COMPUTER_NAME_FORMAT
-- lpBuffer : LPSTR optional, out
-- nSize : DWORD* in/out
-- 構造体/GUIDへのポインタは cdef が通るよう void* で表記(実型は各引数コメント参照)。値渡し構造体・enum は対応する typedef を cdef に追加すること。
const koffi = require('koffi');
const lib = koffi.load('KERNEL32.dll');
const GetComputerNameExA = lib.func('__stdcall', 'GetComputerNameExA', 'int32_t', ['int32_t', 'char *', 'uint32_t *']);
// GetComputerNameExA(NameType, lpBuffer, nSize)
// NameType : COMPUTER_NAME_FORMAT -> 'int32_t'
// lpBuffer : LPSTR optional, out -> 'char *'
// nSize : DWORD* in/out -> 'uint32_t *'
// 出力ポインタは koffi.out(...) で包む。構造体は koffi.struct で定義。
const lib = Deno.dlopen("KERNEL32.dll", {
  GetComputerNameExA: { parameters: ["i32", "buffer", "pointer"], result: "i32" },
});
// lib.symbols.GetComputerNameExA(NameType, lpBuffer, nSize)
// NameType : COMPUTER_NAME_FORMAT -> "i32"
// lpBuffer : LPSTR optional, out -> "buffer"
// nSize : DWORD* in/out -> "pointer"
// 文字列は "buffer"。ANSI(-A) は new TextEncoder() で UTF-8/ANSI バイト列(末尾に \x00)を渡す。
// 値渡し構造体は { struct: [ ...field types... ] } を使用。
<?php
$ffi = FFI::cdef(<<<C
int32_t GetComputerNameExA(
    int32_t NameType,
    char* lpBuffer,
    uint32_t* nSize);
C, "KERNEL32.dll");
// $ffi->GetComputerNameExA(NameType, lpBuffer, nSize);
// NameType : COMPUTER_NAME_FORMAT
// lpBuffer : LPSTR 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.ASCII_OPTIONS);
    boolean GetComputerNameExA(
        int NameType,   // COMPUTER_NAME_FORMAT
        byte[] lpBuffer,   // LPSTR optional, out
        IntByReference nSize   // DWORD* in/out
    );
}
@[Link("kernel32")]
lib LibKERNEL32
  fun GetComputerNameExA = GetComputerNameExA(
    NameType : Int32,   # COMPUTER_NAME_FORMAT
    lpBuffer : UInt8*,   # LPSTR 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 GetComputerNameExANative = Int32 Function(Int32, Pointer<Utf8>, Pointer<Uint32>);
typedef GetComputerNameExADart = int Function(int, Pointer<Utf8>, Pointer<Uint32>);
final GetComputerNameExA = DynamicLibrary.open('KERNEL32.dll')
    .lookupFunction<GetComputerNameExANative, GetComputerNameExADart>('GetComputerNameExA');
// NameType : COMPUTER_NAME_FORMAT -> Int32
// lpBuffer : LPSTR optional, out -> Pointer<Utf8>
// nSize : DWORD* in/out -> Pointer<Uint32>
// 文字列は package:ffi の "...".toNativeUtf16()/toNativeUtf8() で変換。
{$mode objfpc}{$H+}
function GetComputerNameExA(
  NameType: Integer;   // COMPUTER_NAME_FORMAT
  lpBuffer: PAnsiChar;   // LPSTR optional, out
  nSize: Pointer   // DWORD* in/out
): BOOL; stdcall;
  external 'KERNEL32.dll' name 'GetComputerNameExA';
import Foreign
import Foreign.C.Types
import Foreign.C.String

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

let getcomputernameexa =
  foreign "GetComputerNameExA"
    (int32_t @-> string @-> (ptr uint32_t) @-> returning int32_t)
(* NameType : COMPUTER_NAME_FORMAT -> int32_t *)
(* lpBuffer : LPSTR optional, out -> string *)
(* 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 ("GetComputerNameExA" get-computer-name-ex-a :convention :stdcall) :int32
  (name-type :int32)   ; COMPUTER_NAME_FORMAT
  (lp-buffer :pointer)   ; LPSTR optional, out
  (n-size :pointer))   ; DWORD* in/out
; isize/usize(INT_PTR/SIZE_T)は x64 前提で :int64/:uint64。x86 では :int32/:uint32。
use Win32::API;
my $GetComputerNameExA = Win32::API::More->new('KERNEL32',
    'BOOL GetComputerNameExA(int NameType, LPSTR lpBuffer, LPVOID nSize)');
# my $ret = $GetComputerNameExA->Call($NameType, $lpBuffer, $nSize);
# NameType : COMPUTER_NAME_FORMAT -> int
# lpBuffer : LPSTR optional, out -> LPSTR
# nSize : DWORD* in/out -> LPVOID
# 値渡し構造体は pack() した文字列、または Win32::API::Struct を使用。

関連項目

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