2011-12-09 19 views
14

Tôi cần phải nhận được trong Delphi một tên miền đủ điều kiện cho một cửa sổ máy trên một tên miền.Làm thế nào để có được tên miền đủ điều kiện trên các cửa sổ ở Delphi

Tôi đã cố gắng sử dụng LookupAccount nhưng nó mang lại cho tôi chỉ tên miền NetBIOS, trong trường hợp của tôi nó là "mạng nội bộ" nhưng tôi cần đầy đủ "intranet.companyname.com"

Bất kỳ ý tưởng?

+0

là máy chủ miền đang chạy trên companyname.com nếu không nó sẽ bị trống ngay cả khi bạn sử dụng đúng chức năng. –

+1

Đây có phải là miền Active Directory không? –

+2

Câu hỏi của bạn không rõ ràng lắm. Tất cả các infos này đều liên quan đến ** machine **, chứ không phải ** user **. – OnTheFly

Trả lời

8

Thử GetUserNameEx chức năng 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; 

sử dụng định dạng NameDnsDomain ví dụ, sẽ cho kết quả www.mydomain.com\user_name nếu bạn đã đăng nhập vào "www.mydomain.com" miền.


Vì bây giờ tôi đã thực hiện điều này cho các nhu cầu của riêng mình trong ứng dụng của mình, @ nhận xét của iPath đã thoát đúng. sử dụng tốt hơn GetComputerNameEx và chỉ định một trong số COMPUTER_NAME_FORMAT cho nhu cầu của riêng bạn.

Một Delphi thực hiện sẽ trông như thế này (phiên bản 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

Bạn có thể đề xuất tham số nào cần được chuyển đến API này không? –

+0

@David, xem cập nhật của tôi – kobik

+0

định dạng tên nào sẽ được sử dụng? –

1

NetGetJoinInformation sẽ hoạt động tốt.

MSDN:

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

Ví dụ:

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

Điều gì nó trả về có thể phụ thuộc vào cách mạng miền được thiết lập. Xin lỗi, tôi không biết chi tiết, nhưng tôi chỉ nhận được một tên miền đơn giản bằng cách sử dụng 'NetGetJoinInformation' tại nơi làm việc. –

+0

Đó là sự thật nếu tên miền không kết thúc bằng '.companyname.com'. Trong trường hợp đó, tra cứu DNS ngược trên địa chỉ IP có thể nhận được FQDN cũng có thể là những gì OP muốn. –

+2

Unfortunatelly mã của bạn chỉ trả về một phần "mạng nội bộ" của tên miền của tôi. Ít nhất là trong miền của tôi. – Gilmor

1

Tôi đã thử tất cả những điều trên, nhưng không thành công. Cuối cùng, tôi định cư chỉ đơn giản là lấy biến môi trường.

uses jclSysInfo; 

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

Đã thử nghiệm trên máy chủ 2008 R2 - hoạt động tốt. Trả về "server.home.lan". Kết quả trong một chuỗi trống trên máy tính được kết nối không thuộc miền Windows 7.

+0

Sẽ cần phải kiểm tra InternetGetConnectedState là USERDNSDOMAIN không bị xóa nếu bạn mất kết nối. Bạn có thể xác minh trên mạng có dây bằng cách rút cáp mạng. –

Các vấn đề liên quan