Delphi - объектно-ориентированный язык программирования, разработанный компанией Borland в 1995 году. Он основан на языке программирования Pascal, но имеет более расширенные возможности и добавлены новые функции.
Delphi является интегрированной средой разработки (IDE), которая позволяет разрабатывать программное обеспечение для различных платформ, включая Windows, macOS, Android и iOS. Delphi достигает многоплатформенности с помощью...
{ The NetGetDCName function returns the name of the primary domain controller (PDC). It does not return the name of the backup domain controller (BDC) for the specified domain. Also, you cannot remote this function to a non-PDC server. Windows 2000/XP: Applications that support DNS-style names should call the function. Domain controllers in this type of environment have a multi-master directory replication relationship. Therefore, it may be advantageous for your application to use a DC that is not the PDC. You can call the DsGetDcName function to locate any DC in the domain; NetGetDCName returns only the name of the PDC. } typeEAccessDenied = Exception; EInvalidOwner = Exception; EInsufficientBuffer = Exception; ELibraryNotFound = Exception; NET_API_STATUS = Integer; const
NERR_Success = 0; var
NTNetGetDCName: function
(Server, Domain: pWideChar; var
DC: pWideChar): NET_API_STATUS; stdcall
; NTNetGetDCNameA: function
(Server, Domain: PChar; var
DC: PChar): NET_API_STATUS; stdcall
; NTNetApiBufferFree: function
(lpBuffer: Pointer): NET_API_STATUS; stdcall
; procedure
NetCheck(ErrCode: NET_API_STATUS); begin
if
ErrCode <> NERR_Success then
begin
case
ErrCode of
ERROR_ACCESS_DENIED: raise
EAccessDenied.Create('Access is Denied'); ERROR_INVALID_OWNER: raise
EInvalidOwner.Create('Cannot assign the owner of this object.'); ERROR_INSUFFICIENT_BUFFER: raise
EInsufficientBuffer.Create('Buffer passed was too small'); else
raise
Exception.Create('Error Code: ' + IntToStr(ErrCode) + #13 + SysErrorMessage(ErrCode)); end
; end
; end
; function
GetPDC(szSystem: string
): string
; { if szSystem = '' return the PDC else return DC for that domain } const
NTlib = 'NETAPI32.DLL'; Win95lib = 'RADMIN32.DLL'; var
pAnsiDomain: PChar; pDomain: PWideChar; System: array
[1..80] of
WideChar; ErrMode: Word; LibHandle: THandle; begin
Result := ''; LibHandle := 0; try
if
Win32Platform = VER_PLATFORM_WIN32_NT then
begin
ErrMode := SetErrorMode(SEM_NOOPENFILEERRORBOX); LibHandle := LoadLibrary(NTlib); SetErrorMode(ErrMode); if
LibHandle = 0 then
raise
ELibraryNotFound.Create('Unable to map library: ' + NTlib); @NTNetGetDCName := GetProcAddress(Libhandle, 'NetGetDCName'); @NTNetApiBufferFree := GetProcAddress(Libhandle, 'NetApiBufferFree'); try
if
szSystem <> '' then
NetCheck(NTNetGetDCName(nil
, StringToWideChar(szSystem, @System, 80), pDomain)) else
NetCheck(NTNetGetDCName(nil
, nil
, pDomain)); Result := WideCharToString(pDomain); finally
NetCheck(NTNetApiBufferFree(pDomain)); end
; end
else
begin
ErrMode := SetErrorMode(SEM_NOOPENFILEERRORBOX); LibHandle := LoadLibrary(Win95lib); SetErrorMode(ErrMode); if
LibHandle = 0 then
raise
ELibraryNotFound.Create('Unable to map library: ' + Win95lib); @NTNetGetDCNameA := GetProcAddress(Libhandle, 'NetGetDCNameA'); @NTNetApiBufferFree := GetProcAddress(LibHandle, 'NetApiBufferFree'); try
if
szSystem <> '' then
NetCheck(NTNetGetDCNameA(nil
, PChar(szSystem), pAnsiDomain)) else
NetCheck(NTNetGetDCNameA(nil
, nil
, pAnsiDomain)); Result := StrPas(pAnsiDomain); finally
NetCheck(NTNetApiBufferFree(pAnsiDomain)); end
; end
; finally
if
LibHandle <> 0 then
begin
FreeLibrary(Libhandle); // free handle if it has been allocated end
; end
; end
; // Example call, Beispielaufruf: procedure
TForm1.Button1Click(Sender: TObject); begin
try
Screen.Cursor := crHourGlass; label1.Caption := GetPDC(''); finally
Screen.Cursor := crDefault; end
; end
;