Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
 
 07:05 Geo
 
 
Во Флориде и в Королевстве сейчас  07:07[Войти] | [Зарегистрироваться]
Ответ на вопрос № 60081

07-03-2008 14:53
Доброго времени суток я хотел бы узнать ответ на вопрос, который уже давно меня мучает.
А вопрос такой: как  создать пользователя програмно
2) как можно присвоить ему статус владельца определенной директории а всем отстальным только чтение и выполнение

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

09-03-2008 05:34
Спасибо огромнейшее все успешно загнулось!!!! здорово
респект тебе! Ура работает Вопрос решен.

08-03-2008 23:09
Ну и заодно - убрал кое-какие явные огрехи. На трезвую голову:)


uses
  ActiveX;
 
function NameToSid(const AName: string;
  const Server: string = ''): PSID;
var
  cbSid, cbDomn, peUse: Cardinal;
  BufSid, BufDmn: array[0..255] of Char;
  pSrv: PChar;
  s: string;
begin
  Result:= nil;
  if AName = '' then
  begin
    cbSid:= sizeof(BufSid);
    if GetUserName(@BufSid[0], cbSid) then
      s:= BufSid else Exit;
  end else
    s:= AName;
  cbSid:= SizeOf(BufSid); cbDomn:= SizeOf(BufDmn);
  if '' = Server then pSrv:= nil else pSrv:= PChar(Server);
  if LookupAccountName(pSrv, PChar(s),
      @BufSid, cbSid, @BufDmn, cbDomn, peUse) then
  begin
    cbSid:= GetLengthSid(@BufSid);
    Result:= AllocMem(cbSid);
    if nil <> Result then Move(BufSid, Result^, cbSid)
    else SetLastError(ERROR_NOT_ENOUGH_MEMORY);
  end;
end;

function SidToName(Sid: PSID;
  out Domain: string; const Server: string = ''): string;
var
  cbUser, cbDomn, peUse: Cardinal;
  BufUser, BufDmn: array[0..255] of Char;
  pSrv: PChar;
begin
  cbUser:= SizeOf(BufUser); cbDomn:= SizeOf(BufDmn);
  Result:= ''; Domain:= '';
  if '' = Server then pSrv:= nil else pSrv:= PChar(Server);
  if LookupAccountSid(pSrv, Sid, @BufUser, cbUser, @BufDmn, cbDomn, peUse)
  then begin
    Result:= BufUser;
    Domain:= BufDmn;
  end;
end;

procedure CreateSecureFolder(const OwnerName, FolderName: string);
var
  SA: TSecurityAttributes;
  SD: TSecurityDescriptor;
  Acl: PACL;
  SidEveryone, SidUser: PSID;
  SzAcl: Cardinal;
begin
  Acl:= nil; SidEveryone:= nil; SidUser:= nil;

  try
    Win32Check(AllocateAndInitializeSid(SECURITY_WORLD_SID_AUTHORITY, 1,
      SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, SidEveryone));
    SidUser:= NameToSid(OwnerName);
    Win32Check(SidUser <> nil);

    SzAcl:= SizeOf(Acl^) + GetLengthSid(SidEveryone) +
      GetLengthSid(SidUser) + 2 * SizeOf(TAccessAllowedAce);
    GetMem(Acl, SzAcl);

    Win32Check(InitializeAcl(ACL^, SzAcl, ACL_REVISION));
    Win32Check(AddAccessAllowedAceEx(Acl^, ACL_REVISION,
      CONTAINER_INHERIT_ACE or OBJECT_INHERIT_ACE, GENERIC_ALL, SidUser));
    Win32Check(AddAccessAllowedAceEx(Acl^, ACL_REVISION,
      CONTAINER_INHERIT_ACE or OBJECT_INHERIT_ACE,
      GENERIC_READ or GENERIC_EXECUTE, SidEveryone));

    Win32Check(InitializeSecurityDescriptor(@SD, SECURITY_DESCRIPTOR_REVISION));
    Win32Check(SetSecurityDescriptorOwner(@SD, SidUser, true));
    Win32Check(SetSecurityDescriptorDacl(@SD, true, Acl, true));

    SA.nLength:= SizeOf(SA);
    SA.lpSecurityDescriptor:= @SD;
    SA.bInheritHandle:= false;

    Win32Check(CreateDirectory(PChar(FolderName), @SA));
   
  finally
    if nil <> Acl then FreeMem(Acl);
    FreeSid(SidEveryone);
    FreeMem(SidUser);
  end;
end;

procedure CreateUser(const UserName, Password, GroupName: WideString;
  PrivilegeLevel: cardinal);
var
  UserInfo: TUserInfo1;
  GroupInfo: TLocalGroupMembersInfo0;
  Rslt: Cardinal;
  ParamErr: Cardinal;
begin
  FillChar(UserInfo, SizeOf(UserInfo), 0);
  UserInfo.usri1_name:= PWideChar(UserName);
  UserInfo.usri1_password:= PWideChar(Password);
  UserInfo.usri1_priv:= PrivilegeLevel;
  Rslt:= NetUserAdd(nil, 1, @UserInfo, @ParamErr);
  if NERR_Success <> Rslt then
    if Rslt = ERROR_INVALID_PARAMETER then
      raise EOSError.CreateFmt('Invalid parameter: %d', [ParamErr])
    else raise EOSError.Create(SysErrorMessage(Rslt));

  GroupInfo.lgrmi0_sid:= NameToSid(UserName);
  Win32Check(GroupInfo.lgrmi0_sid <> nil);
  try
    Rslt:= NetLocalGroupAddMembers(nil, PWideChar(GroupName), 0, @GroupInfo, 1);
    if NERR_Success <> Rslt then
      raise EOSError.Create(SysErrorMessage(Rslt));
  finally
    FreeMem(GroupInfo.lgrmi0_sid);
  end;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  User, Pswrd, Group, Domain: string;
  hUser: THandle;
  SidUsers: PSID;
begin
  Win32Check(AllocateAndInitializeSid(SECURITY_NT_AUTHORITY, 2,
    SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_USERS, 0, 0, 0,
    0, 0, 0, SidUsers));
  try
    Group:= SidToName(SidUsers, Domain);
  finally
    FreeSid(SidUsers);
  end;
  User:= 'Pupkin';
  Pswrd:= 'PupkinPassword';
  CreateUser(User, Pswrd, Group, USER_PRIV_USER);

  Win32Check(LogonUser(PChar(User), nil, PChar(Pswrd),
    LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, hUser));
  try
    if ImpersonateLoggedOnUser(hUser) then
    try
      CreateSecureFolder(User, Edit1.Text);
    finally
      RevertToSelf;
    end else
      RaiseLastOSError;
  finally
    CloseHandle(hUser);
  end;
end;



Зачем добавляется в группу - чтобы создать папку, новый юзер должен иметь доступ в директорию, в которую она создается. Я проверял на директории, к которой полный доступ имеют "Пользователи", отсюда и выбор группы. В реальных условиях все может быть иначе, но писать полнофункциональный код я не буду - лень.
 NS

08-03-2008 23:03
Ладно, сказал "А", скажу и "Б".


uses
  Windows;

const
  SECURITY_WORLD_SID_AUTHORITY:  TSidIdentifierAuthority =
                                      (Value: (0, 0, 0, 0, 0, 1));
  SECURITY_NT_AUTHORITY:          TSidIdentifierAuthority =
                                      (Value: (0, 0, 0, 0, 0, 5));

  SECURITY_WORLD_RID                = 0;
  SECURITY_BUILTIN_DOMAIN_RID      = 32;
  DOMAIN_ALIAS_RID_USERS            = 545;
  ACL_REVISION                      = 2;
  OBJECT_INHERIT_ACE                = $1;
  CONTAINER_INHERIT_ACE            = $2;
  USER_PRIV_USER                    = 1;
  NERR_Success                      = 0;

type
  TAceHeader = packed record
    AceType: Byte;
    AceFlags: Byte;
    AceSize: Word;
  end;

  TAccessAllowedAce = packed record
    Header: TAceHeader;
    Mask: ACCESS_MASK;
    SidStart: DWORD;
  end;

  TUserInfo1 = packed record
    usri1_name: PWideChar;
    usri1_password: PWideChar;
    usri1_password_age: DWORD;
    usri1_priv: DWORD;
    usri1_home_dir: PWideChar;
    usri1_comment: PWideChar;
    usri1_flags: DWORD;
    usri1_script_path: PWideChar;
  end;

  TLocalGroupMembersInfo0 = packed record
    lgrmi0_sid: PSID;
  end;
 
  NET_API_STATUS = DWORD;

function NetUserAdd(servername: PWideChar; level: DWORD; buf: Pointer;
  parm_err: PDWORD): NET_API_STATUS; stdcall; external 'netapi32.dll';

function NetLocalGroupAddMembers(servername: PWideChar; groupname: PWideChar;
  level: DWORD; buf: Pointer; totalentries: DWORD): NET_API_STATUS; stdcall;
  external 'netapi32.dll';

 NS

08-03-2008 11:30

[Ошибка] Unit1.pas(62): Undeclared identifier: 'SECURITY_WORLD_SID_AUTHORITY'
[Ошибка] Unit1.pas(63): Undeclared identifier: 'SECURITY_WORLD_RID'
[Ошибка] Unit1.pas(67): Undeclared identifier: 'TAccessAllowedAce'
[Ошибка] Unit1.pas(70): Undeclared identifier: 'ACL_REVISION'
[Ошибка] Unit1.pas(72): Undeclared identifier: 'CONTAINER_INHERIT_ACE'
[Ошибка] Unit1.pas(72): Undeclared identifier: 'OBJECT_INHERIT_ACE'
[Ошибка] Unit1.pas(95): Undeclared identifier: 'TUserInfo1'
[Ошибка] Unit1.pas(96): Undeclared identifier: 'TLocalGroupMembersInfo0'
[Ошибка] Unit1.pas(103): Undeclared identifier: 'USER_PRIV_USER'
[Ошибка] Unit1.pas(104): Undeclared identifier: 'NetUserAdd'
[Ошибка] Unit1.pas(105): Undeclared identifier: 'NERR_Success'
[Ошибка] Unit1.pas(108): Undeclared identifier: 'NERR_BASE'
[Ошибка] Unit1.pas(116): Undeclared identifier: 'NetLocalGroupAddMembers'

Значения констант ищешь в msdn.microsoft.com.
У дельфовых типов убираешь T и добавляешь _, например:
TAccessAllowedAce -> Access_Allowed_Ace. Далее ищешь там же.

08-03-2008 06:43
делфи постоянно плюеться на строку
    Win32Check(AllocateAndInitializeSid(SECURITY_WORLD_SID_AUTHORITY, 1,
      SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, SidEveryone));
    SidUser:= NameToSid(OwnerName);
и что то про платформу трет

лог ошибок
[Предупреждение] Unit1.pas(62): Symbol 'Win32Check' is specific to a platform
[Ошибка] Unit1.pas(62): Undeclared identifier: 'SECURITY_WORLD_SID_AUTHORITY'
[Ошибка] Unit1.pas(63): Undeclared identifier: 'SECURITY_WORLD_RID'
[Ошибка] Unit1.pas(67): Undeclared identifier: 'TAccessAllowedAce'
[Предупреждение] Unit1.pas(70): Symbol 'Win32Check' is specific to a platform
[Ошибка] Unit1.pas(70): Undeclared identifier: 'ACL_REVISION'
[Предупреждение] Unit1.pas(71): Symbol 'Win32Check' is specific to a platform
[Ошибка] Unit1.pas(72): Undeclared identifier: 'CONTAINER_INHERIT_ACE'
[Ошибка] Unit1.pas(72): Undeclared identifier: 'OBJECT_INHERIT_ACE'
[Предупреждение] Unit1.pas(72): Combining signed and unsigned types - widened both operands
[Предупреждение] Unit1.pas(73): Symbol 'Win32Check' is specific to a platform
[Предупреждение] Unit1.pas(74): Combining signed and unsigned types - widened both operands
[Предупреждение] Unit1.pas(77): Symbol 'Win32Check' is specific to a platform
[Предупреждение] Unit1.pas(78): Symbol 'Win32Check' is specific to a platform
[Предупреждение] Unit1.pas(79): Symbol 'Win32Check' is specific to a platform
[Предупреждение] Unit1.pas(85): Symbol 'Win32Check' is specific to a platform
[Ошибка] Unit1.pas(95): Undeclared identifier: 'TUserInfo1'
[Ошибка] Unit1.pas(96): Undeclared identifier: 'TLocalGroupMembersInfo0'
[Ошибка] Unit1.pas(101): Missing operator or semicolon
[Ошибка] Unit1.pas(102): Missing operator or semicolon
[Ошибка] Unit1.pas(103): Missing operator or semicolon
[Ошибка] Unit1.pas(103): Undeclared identifier: 'USER_PRIV_USER'
[Ошибка] Unit1.pas(104): Undeclared identifier: 'NetUserAdd'
[Ошибка] Unit1.pas(105): Undeclared identifier: 'NERR_Success'
[Предупреждение] Unit1.pas(105): Comparing signed and unsigned types - widened both operands
[Ошибка] Unit1.pas(108): Undeclared identifier: 'NERR_BASE'
[Предупреждение] Unit1.pas(112): Combining signed and unsigned types - widened both operands
[Ошибка] Unit1.pas(114): Missing operator or semicolon
[Ошибка] Unit1.pas(116): Undeclared identifier: 'NetLocalGroupAddMembers'
[Предупреждение] Unit1.pas(117): Comparing signed and unsigned types - widened both operands
[Предупреждение] Unit1.pas(118): Comparing signed and unsigned types - widened both operands
[Предупреждение] Unit1.pas(122): Combining signed and unsigned types - widened both operands
[Ошибка] Unit1.pas(124): Incompatible types
[Ошибка] Unit1.pas(126): '.' expected but ';' found
[Предупреждение] Unit1.pas(138): Symbol 'Win32Check' is specific to a platform
[Ошибка] Unit1.pas(143): Undeclared identifier: 'Edit1'
[Ошибка] Unit1.pas(146): ';' expected but 'ELSE' found
[Предупреждение] Unit1.pas(148): Text after final 'END.' - ignored by compiler
[Фатальная ошибка] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
я на на нее не учился я пока самоучка по это му мне тяжеловато

08-03-2008 06:37
2 meinung
>>>и мне кажеться дело не вто, что я в private не ппихнул процедуры
Ну вот, я же говорил, что Вам рано за это браться. Слишком многих совсем простых Вы еще не знаете, не говоря уж о сложных:(
 NS

08-03-2008 06:34
В procedure CreateUser строку
GroupInfo.lgrmi0_sid:= NameToSid('Pupkin');
замените на
GroupInfo.lgrmi0_sid:= NameToSid(UserName);

И вообще, повнимательней с кодом, выпимши я:))
 NS

08-03-2008 06:34
ай спасибо, я понял некоторые функции кода в особенности клик по кнопек :)  но делфи плюеться
вот собстно что она наплевала
[Предупреждение] Unit1.pas(62): Symbol 'Win32Check' is specific to a platform
[Ошибка] Unit1.pas(62): Undeclared identifier: 'SECURITY_WORLD_SID_AUTHORITY'
[Ошибка] Unit1.pas(63): Undeclared identifier: 'SECURITY_WORLD_RID'
[Ошибка] Unit1.pas(67): Undeclared identifier: 'TAccessAllowedAce'
[Предупреждение] Unit1.pas(70): Symbol 'Win32Check' is specific to a platform
[Ошибка] Unit1.pas(70): Undeclared identifier: 'ACL_REVISION'
[Предупреждение] Unit1.pas(71): Symbol 'Win32Check' is specific to a platform
[Ошибка] Unit1.pas(72): Undeclared identifier: 'CONTAINER_INHERIT_ACE'
[Ошибка] Unit1.pas(72): Undeclared identifier: 'OBJECT_INHERIT_ACE'
[Предупреждение] Unit1.pas(72): Combining signed and unsigned types - widened both operands
[Предупреждение] Unit1.pas(73): Symbol 'Win32Check' is specific to a platform
[Предупреждение] Unit1.pas(74): Combining signed and unsigned types - widened both operands
[Предупреждение] Unit1.pas(77): Symbol 'Win32Check' is specific to a platform
[Предупреждение] Unit1.pas(78): Symbol 'Win32Check' is specific to a platform
[Предупреждение] Unit1.pas(79): Symbol 'Win32Check' is specific to a platform
[Предупреждение] Unit1.pas(85): Symbol 'Win32Check' is specific to a platform
[Ошибка] Unit1.pas(95): Undeclared identifier: 'TUserInfo1'
[Ошибка] Unit1.pas(96): Undeclared identifier: 'TLocalGroupMembersInfo0'
[Ошибка] Unit1.pas(101): Missing operator or semicolon
[Ошибка] Unit1.pas(102): Missing operator or semicolon
[Ошибка] Unit1.pas(103): Missing operator or semicolon
[Ошибка] Unit1.pas(103): Undeclared identifier: 'USER_PRIV_USER'
[Ошибка] Unit1.pas(104): Undeclared identifier: 'NetUserAdd'
[Ошибка] Unit1.pas(105): Undeclared identifier: 'NERR_Success'
[Предупреждение] Unit1.pas(105): Comparing signed and unsigned types - widened both operands
[Ошибка] Unit1.pas(108): Undeclared identifier: 'NERR_BASE'
[Предупреждение] Unit1.pas(112): Combining signed and unsigned types - widened both operands
[Ошибка] Unit1.pas(114): Missing operator or semicolon
[Ошибка] Unit1.pas(116): Undeclared identifier: 'NetLocalGroupAddMembers'
[Предупреждение] Unit1.pas(117): Comparing signed and unsigned types - widened both operands
[Предупреждение] Unit1.pas(118): Comparing signed and unsigned types - widened both operands
[Предупреждение] Unit1.pas(122): Combining signed and unsigned types - widened both operands
[Ошибка] Unit1.pas(124): Incompatible types
[Ошибка] Unit1.pas(126): '.' expected but ';' found
[Предупреждение] Unit1.pas(138): Symbol 'Win32Check' is specific to a platform
[Ошибка] Unit1.pas(143): Undeclared identifier: 'Edit1'
[Ошибка] Unit1.pas(146): ';' expected but 'ELSE' found
[Предупреждение] Unit1.pas(148): Text after final 'END.' - ignored by compiler
[Фатальная ошибка] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
и мне кажеться дело не вто, что я в private не ппихнул процедуры

08-03-2008 06:24
>>>я не владею английским

Это плохо. Совсем. Учите, пока молоды, не повторяйте моих ошибок. Тем более, что для чтения документации особо глубоких знаний не требуется. Ну а код - ладно, вот Вам код. Ради праздника:))


function NameToSid(const AName: string;
  const Server: string = ''): PSID;
var
  cbSid, cbDomn, peUse: Cardinal;
  BufSid, BufDmn: array[0..255] of Char;
  pSrv: PChar;
  s: string;
begin
  Result:= nil;
  if AName = '' then
  begin
    cbSid:= sizeof(BufSid);
    if GetUserName(@BufSid[0], cbSid) then
      s:= PChar(@BufSid[0]) else Exit;
  end else
    s:= AName;
  cbSid:= SizeOf(BufSid); cbDomn:= SizeOf(BufDmn);
  if '' = Server then pSrv:= nil else pSrv:= PChar(Server);
  if LookupAccountName(pSrv, PChar(s),
      @BufSid, cbSid, @BufDmn, cbDomn, peUse) then
  begin
    cbSid:= GetLengthSid(@BufSid);
    GetMem(Result, cbSid);
    Move(BufSid, Result^, cbSid);
  end;
end;

procedure CreateSecureFolder(const OwnerName, FolderName: string);
var
  SA: TSecurityAttributes;
  SD: TSecurityDescriptor;
  Acl: PACL;
  SidEveryone, SidUser: PSID;
  SzAcl: Cardinal;
begin
  Acl:= nil; SidEveryone:= nil; SidUser:= nil;

  try
    Win32Check(AllocateAndInitializeSid(SECURITY_WORLD_SID_AUTHORITY, 1,
      SECURITY_WORLD_RID, 0, 0, 0, 0, 0, 0, 0, SidEveryone));
    SidUser:= NameToSid(OwnerName);

    SzAcl:= SizeOf(Acl^) + GetLengthSid(SidEveryone) +
      GetLengthSid(SidUser) + 2 * SizeOf(TAccessAllowedAce);
    GetMem(Acl, SzAcl);

    Win32Check(InitializeAcl(ACL^, SzAcl, ACL_REVISION));
    Win32Check(AddAccessAllowedAceEx(Acl^, ACL_REVISION,
      CONTAINER_INHERIT_ACE or OBJECT_INHERIT_ACE, GENERIC_ALL, SidUser));
    Win32Check(AddAccessAllowedAceEx(Acl^, ACL_REVISION,
      CONTAINER_INHERIT_ACE or OBJECT_INHERIT_ACE,
      GENERIC_READ or GENERIC_EXECUTE, SidEveryone));

    Win32Check(InitializeSecurityDescriptor(@SD, SECURITY_DESCRIPTOR_REVISION));
    Win32Check(SetSecurityDescriptorOwner(@SD, SidUser, true));
    Win32Check(SetSecurityDescriptorDacl(@SD, true, Acl, true));

    SA.nLength:= SizeOf(SA);
    SA.lpSecurityDescriptor:= @SD;
    SA.bInheritHandle:= false;

    Win32Check(CreateDirectory(PChar(FolderName), @SA));
   
  finally
    if nil <> Acl then FreeMem(Acl);
    FreeSid(SidEveryone);
    FreeMem(SidUser);
  end;
end;

procedure CreateUser(const UserName, Password, GroupName: WideString);
var
  UserInfo: TUserInfo1;
  GroupInfo: TLocalGroupMembersInfo0;
  Rslt: Cardinal;
  ParamErr: Cardinal;
begin
  FillChar(UserInfo, SizeOf(UserInfo), 0);
  UserInfo.usri1_name:= PWideChar(UserName);
  UserInfo.usri1_password:= PWideChar(Password);
  UserInfo.usri1_priv:= USER_PRIV_USER;
  Rslt:= NetUserAdd(nil, 1, @UserInfo, @ParamErr);
  if NERR_Success <> Rslt then
    if Rslt = ERROR_INVALID_PARAMETER then
      raise EOSError.CreateFmt('Invalid parameter: %d', [ParamErr])
    else if Rslt < NERR_BASE then
      raise EOSError.Create(SysErrorMessage(Rslt))
  else
    raise EOSError.CreateFmt('Can''t Add user "%s". NetApi error: %d',
      [UserName, Rslt - NERR_BASE]);

  GroupInfo.lgrmi0_sid:= NameToSid('Pupkin');
  try
    Rslt:= NetLocalGroupAddMembers(nil, PWideChar(GroupName), 0, @GroupInfo, 1);
    if NERR_Success <> Rslt then
      if Rslt < NERR_BASE then
        raise EOSError.Create(SysErrorMessage(Rslt))
      else raise Exception.CreateFmt(
        'Can''t Add user "%s" to group "%s". NetApi error: %d',
        [UserName, GroupName, Rslt - NERR_BASE]);
  finally
    FreeMem(GroupInfo.lgrmi0_sid);
  end;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  User, Pswrd, Group: string;
  hUser: THandle;
begin
  User:= 'Pupkin';
  Pswrd:= 'PupkinPassword';
  Group:= 'Пользователи';
  CreateUser(User, Pswrd, Group);

  Win32Check(LogonUser(PChar(User), nil, PChar(Pswrd),
    LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, hUser));

  if ImpersonateLoggedOnUser(hUser) then
  try
    CreateSecureFolder(User, Edit1.Text);
  finally
    RevertToSelf;
  end else
    RaiseLastOSError;
end;

 NS

08-03-2008 05:26
ну а если получится я начинал  от сложного к простому а вдруг распишите код если не составит труда тем более что я не владею английским.

08-03-2008 05:21
>>>знаете вкладку безопасность если  в свойствах папки убрать галочку использовать простой доступ к файлам?

Да ну, что Вы, откуда?!

>>>функция NETUSERADD есть параметры
Очень тонкое наблюдение.
>>> распишите полностью если не трудно
Зачем? Они отлично расписаны и в дельфийской справке, и в MSDN.
>>>У меня маленький опыт в кодинге
Значит, Вам рано браться за столь деликатную область, как безопасность. Есть множество других, не менее интересных задач, которые вполне по силам начинающим.

Я конечно могу написать Вам код, но боюсь, он Вам ничего не даст. Слишком много здесь нюансов, без знания которых у Вас все равно ничего не получится - даже с готовым кодом. А разобравшись с этими нюансами, Вы и сами без особого труда напишите код.
 NS

08-03-2008 04:06
знаете вкладку безопасность если  в свойствах папки убрать галочку использовать простой доступ к файлам? вот про эти разрешения я говорю, и функция NETUSERADD есть параметры распишите полностью если не трудно. У меня маленький опыт в кодинге

07-03-2008 20:51
>>>как  создать пользователя програмно
NetUserAdd
>>>как можно присвоить ему статус владельца определенной директории
Как один из способов - SetNamedSecurityInfo с SE_FILE_OBJECT и OWNER_SECURITY_INFORMATION.
>>>всем отстальным только чтение и выполнение
Что подразумевается? Базовые (GENERIC_) ? Стандартные (STANDARD_RIGHTS_) ? File specific ( FILE_READ_DATA etc) ? Сначала с этим определиться, потом создать DACL с разрешающими ACE  - для владельца с полным доступом, и еще с одним для группы Everyone с этими правами и с наследованием. Или другой группы, из вопроса не ясно.
 NS

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Жил-был у бабушки серенький КТО?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования