Ветеран

Сообщения: 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;
|