Доброго времени суток я хотел бы узнать ответ на вопрос, который уже давно меня мучает.
А вопрос такой: как создать пользователя програмно
2) как можно присвоить ему статус владельца определенной директории а всем отстальным только чтение и выполнение
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
09-03-2008 05:34
Спасибо огромнейшее все успешно загнулось!!!! здорово
респект тебе! Ура работает Вопрос решен.
Ну и заодно - убрал кое-какие явные огрехи. На трезвую голову:)
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;
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;
Зачем добавляется в группу - чтобы создать папку, новый юзер должен иметь доступ в директорию, в которую она создается. Я проверял на директории, к которой полный доступ имеют "Пользователи", отсюда и выбор группы. В реальных условиях все может быть иначе, но писать полнофункциональный код я не буду - лень.
Значения констант ищешь в msdn.microsoft.com.
У дельфовых типов убираешь T и добавляешь _, например:
TAccessAllowedAce -> Access_Allowed_Ace. Далее ищешь там же.
делфи постоянно плюеться на строку
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'
я на на нее не учился я пока самоучка по это му мне тяжеловато
2 meinung
>>>и мне кажеться дело не вто, что я в private не ппихнул процедуры
Ну вот, я же говорил, что Вам рано за это браться. Слишком многих совсем простых Вы еще не знаете, не говоря уж о сложных:(
ай спасибо, я понял некоторые функции кода в особенности клик по кнопек :) но делфи плюеться
вот собстно что она наплевала
[Предупреждение] 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 не ппихнул процедуры
Это плохо. Совсем. Учите, пока молоды, не повторяйте моих ошибок. Тем более, что для чтения документации особо глубоких знаний не требуется. Ну а код - ладно, вот Вам код. Ради праздника:))
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;
>>>знаете вкладку безопасность если в свойствах папки убрать галочку использовать простой доступ к файлам?
Да ну, что Вы, откуда?!
>>>функция NETUSERADD есть параметры
Очень тонкое наблюдение.
>>> распишите полностью если не трудно
Зачем? Они отлично расписаны и в дельфийской справке, и в MSDN.
>>>У меня маленький опыт в кодинге
Значит, Вам рано браться за столь деликатную область, как безопасность. Есть множество других, не менее интересных задач, которые вполне по силам начинающим.
Я конечно могу написать Вам код, но боюсь, он Вам ничего не даст. Слишком много здесь нюансов, без знания которых у Вас все равно ничего не получится - даже с готовым кодом. А разобравшись с этими нюансами, Вы и сами без особого труда напишите код.
знаете вкладку безопасность если в свойствах папки убрать галочку использовать простой доступ к файлам? вот про эти разрешения я говорю, и функция NETUSERADD есть параметры распишите полностью если не трудно. У меня маленький опыт в кодинге
>>>как создать пользователя програмно
NetUserAdd
>>>как можно присвоить ему статус владельца определенной директории
Как один из способов - SetNamedSecurityInfo с SE_FILE_OBJECT и OWNER_SECURITY_INFORMATION.
>>>всем отстальным только чтение и выполнение
Что подразумевается? Базовые (GENERIC_) ? Стандартные (STANDARD_RIGHTS_) ? File specific ( FILE_READ_DATA etc) ? Сначала с этим определиться, потом создать DACL с разрешающими ACE - для владельца с полным доступом, и еще с одним для группы Everyone с этими правами и с наследованием. Или другой группы, из вопроса не ясно.
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.