Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1274
Благодарности: 1030

Профиль | Отправить PM | Цитировать


AnastasiyaM, вам нужно создавать пользователя уже с паролем, иначе на первом же логоне система скажет ни-ни, потом создать профиль и получить SID. Вот пример без автологона и с требованием пароля при первом входе. Пароль и прочие настройки вам все равно придется в учетке пользователя делать.
Скрытый текст

Код: Выделить весь код
[Registry]
#define UserName "Visitor"
Root: HKU; Subkey: {code:GetUserSid|{#UserName}}\Software\Microsoft\Windows\CurrentVersion\Run; ValueName: {#MyAppExeName}; ValueType: string; ValueData: {app}\{#MyAppExeName}; Check: CheckCreateUser('{#UserName}')

[Code]
#define A = (Defined UNICODE) ? "W" : "A"
const
  ERROR_SUCCESS = 0;
  ERROR_INSUFFICIENT_BUFFER = 122;
  LOGON32_LOGON_INTERACTIVE = 2;
  LOGON32_PROVIDER_DEFAULT = 0;

type
  TProfileInfo = record
    dwSize: DWORD;
    dwFlags: DWORD;
    lpUserName: string;
    lpProfilePath: string;
    lpDefaultPath: string;
    lpServerName: string;
    lpPolicyPath: string;
    hProfile: THandle;
  end;

function LookupAccountName(lpSystemName, lpAccountName: string;
  var Sid: Byte; var cbSid: DWORD; ReferencedDomainName: string;
  var cbReferencedDomainName: DWORD; var peUse: LongWord): BOOL; external 'LookupAccountName{#A}@advapi32.dll stdcall';
function ConvertSidToStringSid(var Sid: Byte; var StringSid: LongWord): BOOL; external 'ConvertSidToStringSid{#A}@advapi32.dll stdcall';
function LogonUser(lpszUsername, lpszDomain, lpszPassword: string;
  dwLogonType, dwLogonProvider: DWORD; var phToken: THandle): BOOL; external 'LogonUser{#A}@advapi32.dll stdcall';
function LoadUserProfile(hToken: THandle; var lpProfileInfo: TProfileInfo): BOOL; external 'LoadUserProfile{#A}@userenv.dll stdcall';
function UnloadUserProfile(hToken, hProfile: THandle): BOOL; external 'UnloadUserProfile@userenv.dll stdcall';
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';

function CheckCreateUser(const UserName: string): Boolean;
var
  TempPassword: string;
  UserToken: THandle;
  ProfileInfo: TProfileInfo;
  ResultCode: Integer;
begin
  Result := False;
  try
    { Create user account. }
    TempPassword := 'PqYDLMAD';
    if not Exec(ExpandConstant('{cmd}'), Format('/c net user "%s" "%s" /add /expires:never', [UserName, TempPassword]), '', SW_HIDE, ewWaitUntilTerminated, ResultCode) or
      (ResultCode <> ERROR_SUCCESS) then Exit;

    { Create user profile. }
    if not LogonUser(UserName, '.', TempPassword, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, UserToken) then
      RaiseException(SysErrorMessage(DLLGetLastError));
    ProfileInfo.dwSize := SizeOf(ProfileInfo);
    ProfileInfo.lpUserName := UserName;
    if not LoadUserProfile(UserToken, ProfileInfo) and
      not UnloadUserProfile(UserToken, ProfileInfo.hProfile) then
      RaiseException(SysErrorMessage(DLLGetLastError));

    { Change user account. }
    if not Exec(ExpandConstant('{cmd}'), Format('/c net user "%s" "" /logonpasswordchg:yes', [UserName]), '', SW_HIDE, ewWaitUntilTerminated, ResultCode) or
      (ResultCode <> ERROR_SUCCESS) then Exit;

    Result := True;
  except
    ShowExceptionMessage;
  finally
    if UserToken <> 0 then
      CloseHandle(UserToken);
  end;
end;

function GetUserSid(const UserName: string): string;
var
  Sid: array of Byte;
  DomainName: string;
  SidSize, DomainNameSize: DWORD;
  Buffer: LongWord;
begin
  Result := '';
  try
    SetArrayLength(Sid, 1);
    if not LookupAccountName('', UserName, Sid[0], SidSize, '', DomainNameSize, Buffer) and
      BOOL(DLLGetLastError <> ERROR_INSUFFICIENT_BUFFER) then Exit;
    SetArrayLength(Sid, SidSize);
    DomainName := StringOfChar(#0, DomainNameSize - 1);
    if not LookupAccountName('', UserName, Sid[0], SidSize, DomainName, DomainNameSize, Buffer) and
      BOOL(DLLGetLastError <> ERROR_SUCCESS) then
      RaiseException(SysErrorMessage(DLLGetLastError));
    if not ConvertSidToStringSid(Sid[0], Buffer) then
      RaiseException(SysErrorMessage(DLLGetLastError));
    Result := CastIntegerToString(Buffer);
  except
    ShowExceptionMessage;
  finally
  end;
end;
Это сообщение посчитали полезным следующие участники:

Отправлено: 12:36, 24-10-2018 | #130