Как проверить, включен ли вход с учетной записью администратора? - PullRequest
1 голос
/ 27 марта 2020

Это видео показывает, как включить / отключить учетную запись администратора:

  1. Запустить cmd.exe от имени администратора
  2. net user Administrator /active:yes - Включить
  3. net user Administrator /active:no - Отключить

Я хочу знать, есть ли возможность программной проверки, если она уже включена или нет ?

Заранее спасибо.

1 Ответ

1 голос
/ 28 марта 2020

Решение работает после предложений, оставленных в комментариях выше и следующих это пример.

program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  Windows,
  ShellAPI,
  SysUtils;

type
  TUserInfo1 = record
    usri1_name: PWideChar;
    usri1_password: PWideChar;
    usri1_password_age: Cardinal;
    usri1_priv: Cardinal;
    usri1_home_dir: PWideChar;
    usri1_comment: PWideChar;
    usri1_flags: Cardinal;
    usri1_script_path: PWideChar;
  end;

  PUserInfo1 = ^TUserInfo1;

function NetUserGetInfo(servername: PWideChar; username: PWideChar; level: Cardinal; var bufptr: PUserInfo1): Cardinal; stdcall; external 'netapi32.dll' name 'NetUserGetInfo';

function IsAdminLoginEnabled: Boolean;
const
  UF_ACCOUNTDISABLE = $0002;
  username = 'Administrator';
var
  ui1: PUserInfo1;
begin
  Result := False;
  if NetUserGetInfo(nil, username, 1, ui1) = 0 then
    Result := (ui1.usri1_flags and UF_ACCOUNTDISABLE) <> UF_ACCOUNTDISABLE;
end;

const
  CmdExePath = 'C:\Windows\System32\cmd.exe';
  AdminLoginEnable = '/C net user Administrator /active:yes';
  AdminLoginDisable = '/C net user Administrator /active:no';

begin
  try
    ShellExecute(0, nil, CmdExePath, AdminLoginEnable, nil, SW_HIDE);
    Sleep(2000);
    Writeln(IsAdminLoginEnabled);
    ShellExecute(0, nil, CmdExePath, AdminLoginDisable, nil, SW_HIDE);
    Sleep(2000);
    Writeln(IsAdminLoginEnabled);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;

end.
...