Как определить, является ли компьютер частью домена или нет - PullRequest
1 голос
/ 09 сентября 2011

Delphi Xe, Win7

Мне нужна следующая функция:

Function isPcInDomain:bool;

Доменное имя меня не интересует, msdn LsaQueryInformationPolicy тоже (или дайте реализацию на Delphi). Я хотел бы иметь функцию, которая не должна запрашивать сеть.
Также он должен работать, если локальное имя компьютера содержит .

Пытался определить доменное имя, но на ПК, который не в домене - в качестве доменного имени выдает имя Local Working group: (

Ответы [ 2 ]

7 голосов
/ 09 сентября 2011

Вы можете использовать NetGetJoinInformation :

program test;

{$APPTYPE CONSOLE}
{$MINENUMSIZE 4}

uses
  Windows, SysUtils;

const
  netapi = 'netapi32.dll';

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

function NetApiBufferFree(Buffer: Pointer): DWORD; stdcall; external netapi;
function NetGetJoinInformation(lpServer: PWideChar; out lpNameBuffer: PWideChar;
  out BufferType: TNetSetupJoinStatus): Cardinal; stdcall; external netapi;

procedure NetApiCheck(RetValue: Cardinal);
begin
  if RetValue <> ERROR_SUCCESS then
    RaiseLastOSError(RetValue);
end;

function GetJoinInfo(out JoinStatus: TNetSetupJoinStatus): WideString;
var
  P: PWideChar;
begin
  NetApiCheck(NetGetJoinInformation(nil, P, JoinStatus));
  Result := P;
  NetApiBufferFree(P);
end;

procedure Main;
const
  JoinStatusStrings: array[TNetSetupJoinStatus] of string = ('Unknown', 'Unjoined', 'Workgroup', 'Domain');
var
  Info: TNetSetupJoinStatus;
  S: WideString;
begin
  S := GetJoinInfo(Info);
  Writeln(Format('%s %s', [JoinStatusStrings[Info], S]));
end;

begin
  try
    Main;
  except
    on E: Exception do
    begin
      ExitCode := 1;
      Writeln(Format('[%s] %s', [E.ClassName, E.Message]));
    end;
  end;
end.
2 голосов
/ 09 сентября 2011
uses
  LSAApi;

function isPcInDomain : Boolean;
var
  ComputerName : TLSAUnicodeStr;
  Attributes : TLsaObjectAttributes;
  PolicyHandle : LSA_HANDLE;
  Status : NTStatus;
  Buffer : Pointer;
  PolicyAccountDomainInfo : PPolicyAccountDomainInfo;
begin
  ComputerName := TLsaUnicodeStr.CreateFromStr('');
  try
    FillChar(Attributes, SizeOf(Attributes), 0);

    Status := LsaOpenPolicy(ComputerName.Value, Attributes, POLICY_VIEW_LOCAL_INFORMATION, PolicyHandle);
    if Status <> STATUS_SUCCESS then
      raise Exception.Create('LsaOpenPolicy Failed: '+SysErrorMessage(LsaNtStatusToWinError(Status)));

    try
      Status := LsaQueryInformationPolicy(PolicyHandle, PolicyPrimaryDomainInformation, Buffer);
      if Status <> STATUS_SUCCESS then
        raise Exception.Create('LsaQueryInformationPolicy Failed: '+SysErrorMessage(LsaNtStatusToWinError(Status)));

      try
        PolicyAccountDomainInfo := Buffer;
        Result := PolicyAccountDomainInfo.DomainSID <> nil
      finally
        LsaFreeMemory(Buffer)
      end;
    finally
      LsaClose(PolicyHandle)
    end;
  finally
    ComputerName.Free;
  end;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...