ドメイン上のWindowsマシンの完全修飾ドメイン名をDelphiで取得する必要があります。DelphiのWindowsで完全修飾ドメイン名を取得する方法
すべてのアイデアは、「intranet.companyname.com」
を私はのLookupAccountSidを使用することを試みたが、それは私だけのNetBIOSドメイン名、 を与え、私の場合、それは「イントラネット」であるが、私は完全な必要がありますか?
ドメイン上のWindowsマシンの完全修飾ドメイン名をDelphiで取得する必要があります。DelphiのWindowsで完全修飾ドメイン名を取得する方法
すべてのアイデアは、「intranet.companyname.com」
を私はのLookupAccountSidを使用することを試みたが、それは私だけのNetBIOSドメイン名、 を与え、私の場合、それは「イントラネット」であるが、私は完全な必要がありますか?
は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;
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;
おそらく、ドメインネットワークの設定方法によって異なります。申し訳ありませんが、詳細はわかりませんが、仕事場では 'NetGetJoinInformation'を使って単純なドメイン名を取得します。 –
ドメイン名が '.companyname.com'で終わらない場合はtrueです。その場合、IPアドレスの逆DNSルックアップによってFQDNが取得される可能性があります。これはOPが望むものでもあります。 –
あなたのコードでは、自分のドメイン名の「イントラネット」部分だけが返されます。少なくとも私のドメイン内で。 – Gilmor
私は成功せず、上記の全てを試してみました。最後に、私は単に環境変数を取得するために解決しました。
uses jclSysInfo;
function GetDomain:string;
begin
result:=GetEnvironmentVariable('USERDNSDOMAIN');
end;
Server 2008 R2でテスト済み - 正常に動作します。 「server.home.lan」を返します。 ドメインに接続されていないWindows 7のPCで空の文字列が返されます。
接続が失われた場合、USERDNSDOMAINはクリアされないので、InternetGetConnectedStateもチェックする必要があります。有線ネットワークでは、ネットワークケーブルを抜いて確認することができます。 –
は、companyname.com上で実行されているドメインサーバーです。それ以外の場合は、正しい機能を使用しても空白になります。 –
Active Directoryドメインですか? –
あなたの質問は非常に明確ではありません。これらの情報はすべて、**ユーザ**ではなく**マシン**に関連しています。 – OnTheFly