2011-12-09 36 views
14

ドメイン上のWindowsマシンの完全修飾ドメイン名をDelphiで取得する必要があります。DelphiのWindowsで完全修飾ドメイン名を取得する方法

すべてのアイデアは、「intranet.companyname.com」

を私はのLookupAccountSidを使用することを試みたが、それは私だけのNetBIOSドメイン名、 を与え、私の場合、それは「イントラネット」であるが、私は完全な必要がありますか?

+0

は、companyname.com上で実行されているドメインサーバーです。それ以外の場合は、正しい機能を使用しても空白になります。 –

+1

Active Directoryドメインですか? –

+2

あなたの質問は非常に明確ではありません。これらの情報はすべて、**ユーザ**ではなく**マシン**に関連しています。 – OnTheFly

答えて

8

GetUserNameEx Windows API関数を試してみてください。あなたは「www.mydomain.com」のドメインにログインしている場合例えばNameDnsDomain形式を使用して

const 
    NameUnknown   = 0; 
    NameFullyQualifiedDN = 1; 
    NameSamCompatible  = 2; 
    NameDisplay   = 3; 
    NameUniqueId   = 6; 
    NameCanonical   = 7; 
    NameUserPrincipal  = 8; 
    NameCanonicalEx  = 9; 
    NameServicePrincipal = 10; 
    NameDnsDomain   = 12; 

function GetUserNameExString(ANameFormat: DWORD): string; 
var 
    Buf: array[0..256] of Char; 
    BufSize: DWORD; 
    GetUserNameEx: function (NameFormat: DWORD; lpNameBuffer: LPSTR; 
    var nSize: ULONG): BOOL; stdcall; 
begin 
    Result := ''; 
    BufSize := SizeOf(Buf) div SizeOf(Buf[0]); 
    GetUserNameEx := GetProcAddress(GetModuleHandle('secur32.dll'), 'GetUserNameExA'); 
    if Assigned(GetUserNameEx) then 
    if GetUserNameEx(ANameFormat, Buf, BufSize) then 
     Result := Buf; 
end; 

www.mydomain.com\user_nameを発生します。


これでアプリケーションで私自身のニーズに合わせてこれを実装して以来、@ iPathのコメントは正しく終了しました。 GetComputerNameExをよく使用し、お客様のニーズに応じてCOMPUTER_NAME_FORMATのいずれかを指定してください。

A Delphiの実装は、この(Unicode版)のようになります。

interface 
... 
type 
    COMPUTER_NAME_FORMAT = (
    ComputerNameNetBIOS, 
    ComputerNameDnsHostname, 
    ComputerNameDnsDomain, 
    ComputerNameDnsFullyQualified, 
    ComputerNamePhysicalNetBIOS, 
    ComputerNamePhysicalDnsHostname, 
    ComputerNamePhysicalDnsDomain, 
    ComputerNamePhysicalDnsFullyQualified, 
    ComputerNameMax); 

function GetComputerNameExString(ANameFormat: COMPUTER_NAME_FORMAT): WideString; 

implementation 
... 
function GetComputerNameExW(NameType: COMPUTER_NAME_FORMAT; lpBuffer: LPWSTR; 
    var nSize: DWORD): BOOL; stdcall; external kernel32 name 'GetComputerNameExW'; 

function GetComputerNameExString(ANameFormat: COMPUTER_NAME_FORMAT): WideString; 
var 
    nSize: DWORD; 
begin 
    nSize := 1024; 
    SetLength(Result, nSize); 
    if GetComputerNameExW(ANameFormat, PWideChar(Result), nSize) then 
    SetLength(Result, nSize) 
    else 
    Result := ''; 
end; 
+0

このAPIに渡す必要のあるパラメータを教えてください。 –

+0

@David、私の更新 – kobik

+0

の名前フォーマットを使用する必要がありますか? –

1

NetGetJoinInformationは正常に動作するはずです。

MSDN:

http://msdn.microsoft.com/en-us/library/windows/desktop/aa370423(v=vs.85).aspx

例:

type 
    PWKSTA_INFO_100 = ^WKSTA_INFO_100; 

    WKSTA_INFO_100 = packed record 
    wki100_platform_id: DWord; 
    wki100_computername: PWChar; 
    wki100_langroup: PWChar; 
    wki100_ver_major: DWord; 
    wki100_ver_minor: DWord; 
    end; 

    TNetSetupJoinStatus = 
    (
    NetSetupUnknownStatus, 
    NetSetupUnjoined, 
    NetSetupWorkgroupName, 
    NetSetupDomainName 
); 

    TNetApiBufferFreeFunction = function(ABuffer: Pointer): DWORD; stdcall; 
    TNetWkstaGetInfoFunction = function(const AServername: PWChar; const ALevel: DWord; const ABufptr: Pointer): DWORD; stdcall; 
    TNetGetJoinInformationFunction = function(const AServerName: PWChar; out ANameBuffer: PWChar; out ABufferType: TNetSetupJoinStatus): DWORD; stdcall; 

const 
    NERR_SUCCESS = 0; 

function GetLocalComputerDomainName: string; 
var 
    NetApiBuffer: Pointer; 
    NetApi: THandle; 
    NetApiBufferFree: TNetApiBufferFreeFunction; 
    NetWkstaGetInfo: TNetWkstaGetInfoFunction; 
    NetGetJoinInformation: TNetGetJoinInformationFunction; 
    NetSetupJoinStatus: TNetSetupJoinStatus; 
    NameBuffer: PWideChar; 
begin 
    Result := ''; 
    NetApi := LoadLibrary('netapi32.dll'); 
    if NetApi <> 0 then 
    begin 
    NetApiBufferFree  := TNetApiBufferFreeFunction( GetProcAddress(NetApi, 'NetApiBufferFree')); 
    NetGetJoinInformation := TNetGetJoinInformationFunction(GetProcAddress(NetApi, 'NetGetJoinInformation')); 
    NetWkstaGetInfo  := TNetWkstaGetInfoFunction(  GetProcAddress(NetApi, 'NetWkstaGetInfo')); 
    if @NetApiBufferFree <> nil then 
    begin 
     if @NetSetupJoinStatus <> nil then 
     begin 
     if NetGetJoinInformation(nil, NameBuffer, NetSetupJoinStatus) = NERR_SUCCESS then 
     begin 
      if NetSetupJoinStatus = NetSetupDomainName then 
      begin 
      Result := NameBuffer; 
      end; 
      NetApiBufferFree(NameBuffer); 
     end; 
     end; 
    end; 
    FreeLibrary(NetApi); 
    end; 
end; 
+0

おそらく、ドメインネットワークの設定方法によって異なります。申し訳ありませんが、詳細はわかりませんが、仕事場では 'NetGetJoinInformation'を使って単純なドメイン名を取得します。 –

+0

ドメイン名が '.companyname.com'で終わらない場合はtrueです。その場合、IPアドレスの逆DNSルックアップによってFQDNが取得される可能性があります。これはOPが望むものでもあります。 –

+2

あなたのコードでは、自分のドメイン名の「イントラネット」部分だけが返されます。少なくとも私のドメイン内で。 – Gilmor

1

私は成功せず、上記の全てを試してみました。最後に、私は単に環境変数を取得するために解決しました。

uses jclSysInfo; 

function GetDomain:string; 
begin 
    result:=GetEnvironmentVariable('USERDNSDOMAIN'); 
end; 

Server 2008 R2でテスト済み - 正常に動作します。 「server.home.lan」を返します。 ドメインに接続されていないWindows 7のPCで空の文字列が返されます。

+0

接続が失われた場合、USERDNSDOMAINはクリアされないので、InternetGetConnectedStateもチェックする必要があります。有線ネットワークでは、ネットワークケーブルを抜いて確認することができます。 –

関連する問題