2011-12-09 9 views
14

में विंडोज़ पर पूरी तरह से योग्य डोमेन नाम कैसे प्राप्त करें मुझे डोमेन पर विंडोज मशीन के लिए डेल्फी में पूरी तरह योग्य डोमेन नाम प्राप्त करने की आवश्यकता है।डेल्फी

मैं LookupAccountSid का उपयोग करने की कोशिश की है, लेकिन यह मेरे मामले में यह "इंट्रानेट" है में मुझे केवल NetBIOS डोमेन नाम, देता है, लेकिन मैं पूरी की जरूरत है "intranet.companyname.com"

किसी भी विचार?

+0

डोमेन नाम.com पर चल रहे डोमेन सर्वर है अन्यथा यह सही होगा यदि आप सही फ़ंक्शन का उपयोग करते हैं तो भी यह खाली होगा। –

+1

क्या यह एक सक्रिय निर्देशिका डोमेन है? –

+2

आपका प्रश्न बहुत स्पष्ट नहीं है। इन सभी इंफोस ** मशीन ** से संबंधित हैं, ** ** ** ** नहीं। – OnTheFly

उत्तर

8

GetUserNameEx Windows API समारोह की कोशिश करो।

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; 

उदाहरण के लिए NameDnsDomain प्रारूप का उपयोग कर, www.mydomain.com\user_name परिणाम यदि आप "www.mydomain.com" डोमेन में लॉग इन किया जाएगा।


चूंकि अब मैंने इसे अपने आवेदन में अपनी जरूरतों के लिए लागू किया है, इसलिए @ आईपैथ की टिप्पणी सही छोड़ दी गई थी। GetComputerNameEx का बेहतर उपयोग करें, और अपनी खुद की जरूरतों के लिए COMPUTER_NAME_FORMAT में से एक निर्दिष्ट करें।

एक डेल्फी कार्यान्वयन इस (यूनिकोड संस्करण) दिखाई देगा:

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

@ डेविड, मेरा अपडेट देखें – 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 'में समाप्त नहीं होता है। उस स्थिति में आईपी पते पर एक रिवर्स डीएनएस लुकअप एफक्यूडीएन प्राप्त कर सकता है जो ओपी चाहता है। –

+2

दुर्भाग्य से आपका कोड केवल मेरे डोमेन नाम का "इंट्रानेट" हिस्सा देता है। कम से कम मेरे डोमेन में। – Gilmor

1

मैं ऊपर के सभी कोशिश की, लेकिन सफलता नहीं मिली। अंत में, मैं बस पर्यावरण चर पकड़ने के लिए बस गया।

uses jclSysInfo; 

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

सर्वर 2008 आर 2 पर परीक्षण - ठीक काम करता है। "Server.home.lan" देता है। विंडोज 7 गैर-डोमेन कनेक्टेड पीसी पर एक खाली स्ट्रिंग में परिणाम।

+0

यदि आप कनेक्शन खो देते हैं तो USERGNSDonne को साफ़ नहीं किया जाएगा क्योंकि USERGNSDonneedState को साफ़ करने की आवश्यकता होगी। आप नेटवर्क केबल को अनप्लग करके वायर्ड नेटवर्क पर सत्यापित कर सकते हैं। –