2010年7月16日

参加しているドメインまたはワークグループの名前を取得する

現在参加しているNTドメインまたはワークグループの名前を取得するにはNetWkstaGetInfo(ja)を使用します。NetWkstaGetInfoで取得した構造体(WKSTA_INFO_100WKSTA_INFO_101WKSTA_INFO_102)はNetApiBufferFree(ja)で解放する必要があることに注意が必要です。
まずこれらのネットワーク管理APIや構造体を定義します。
uses
  Windows;

type
  NET_API_STATUS = DWORD;
  {$EXTERNALSYM NET_API_STATUS}

  PWKSTA_INFO_100 = ^WKSTA_INFO_100;
  {$EXTERNALSYM PWKSTA_INFO_100}
  _WKSTA_INFO_100 = record
    wki100_platform_id: DWORD;
    wki100_computername: PWideChar;
    wki100_langroup: PWideChar;
    wki100_ver_major: DWORD;
    wki100_ver_minor: DWORD;
  end;
  {$EXTERNALSYM _WKSTA_INFO_100}
  WKSTA_INFO_100 = _WKSTA_INFO_100;
  {$EXTERNALSYM WKSTA_INFO_100}

  PWKSTA_INFO_101 = ^WKSTA_INFO_101;
  {$EXTERNALSYM PWKSTA_INFO_101}
  _WKSTA_INFO_101 = record
    wki101_platform_id: DWORD;
    wki101_computername: PWideChar;
    wki101_langroup: PWideChar;
    wki101_ver_major: DWORD;
    wki101_ver_minor: DWORD;
    wki101_lanroot: PWideChar;
  end;
  {$EXTERNALSYM _WKSTA_INFO_101}
  WKSTA_INFO_101 = _WKSTA_INFO_101;
  {$EXTERNALSYM WKSTA_INFO_101}

  PWKSTA_INFO_102 = ^WKSTA_INFO_102;
  {$EXTERNALSYM PWKSTA_INFO_102}
  _WKSTA_INFO_102 = record
    wki102_platform_id: DWORD;
    wki102_computername: PWideChar;
    wki102_langroup: PWideChar;
    wki102_ver_major: DWORD;
    wki102_ver_minor: DWORD;
    wki102_lanroot: PWideChar;
    wki102_logged_on_users: DWORD;
  end;
  {$EXTERNALSYM _WKSTA_INFO_102}
  WKSTA_INFO_102 = _WKSTA_INFO_102;
  {$EXTERNALSYM WKSTA_INFO_102}

const
  NERR_Success = 0;
  {$EXTERNALSYM NERR_Success}

function NetWkstaGetInfo(servername: PWideChar; level: DWORD;
                         var bufptr: PByte): NET_API_STATUS; stdcall;
  external 'netapi32.dll' Name 'NetWkstaGetInfo';
  {$EXTERNALSYM NetWkstaGetInfo}

function NetApiBufferFree(Buffer: Pointer): NET_API_STATUS; stdcall;
  external 'netapi32.dll' Name 'NetApiBufferFree';
  {$EXTERNALSYM NetApiBufferFree}

今回はローカルコンピュータのNTドメイン/ワークグループ名があれば十分なので、servernameにNULLを、levelに100を指定してWKSTA_INFO_100構造体を取得し、wki100_langroupに格納されている文字列を取り出します。
function GetNTDomainName: String;
var
  Ptr: PWKSTA_INFO_100;
begin

  Result := '';
  if NetWkstaGetInfo(nil,100,PByte(Ptr)) <> NERR_Success then
  begin
    Exit;
  end;

  Result := Ptr^.wki100_langroup;
  NetApiBufferFree(Ptr);

end;

ただしこの方法ではNTドメインに参加しているのかワークグループに参加しているのかを知ることができないので、NetGetJoinInformationを使用する方法をお勧めします。

元ねたはDelphiDabbler.comGet the network computer and domain names

0 件のコメント: