![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создание шары для определенного пользователя [D6, WinXP]
ja © (2004-11-17 23:08:00)Уважаемые мастера! По вопросу создания шары опубликовано множество подсказок, пытался разобраться в msdn, искал по rsdn, но чё-то у меня все равно не получается.
Первый вопрос на котором застрял: ругаецца " Синтаксическая ошибка в имени файла, имени папки или метке тома" при вызове NetShareAdd, причем смущает тот факт, что в передаваемой при вызове структуре SHARE_INFO_502в msdn элементы shi502_netname, shi502_path и др. описаны как LPWSTR, а в библиотеке Win32Api (модуль lm) они же описаны, как LPTSTR - это ставит меня в тупик, как я не пытался извратится (последнее, что нашел в поисках ответа - пример на каком-то языке приведения в Unicode, т.е. в WideChar, а потом обратно в PChar), так ничего у меня и не получается, переопределять структуру в lm.pas тоже пробовал - результат упорно не меняется.
Это значит раз.
Но что я совсем понять не в состоянии, так это то, что в процессе тыканья у меня вдруг в неизменяемой по ходу части кода, переделанной из сишного примера, опубликованного старшими товарищами (правда, примеры мне попадались только без конкретизации пользователя - наверное не там искал), а именно при попытке SetSecurityDescriptorDacl, стал вдруг ругацца " уровень редакции неизвестен", а потом также вдруг перестал. Отчего это могло быть?
Код, в котором в Edit1 - имя предварительно созданного пользователя:
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, lm, WinNT, WinBase;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button2: TButton;
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject);
var
nStatus: NET_API_STATUS;
SidLen, DomenLen: DWord;
SidNameUse: SID_NAME_USE;
sid: PSID;
pcsid, DomenName: PChar;
p: TShareInfo502;
parm_err: LPDWORD;
pSD: PSECURITY_DESCRIPTOR;
theACL: ACL;
Len_ACL: DWORD;
wcnetname, wcremark, wcpath: PWideChar;
s: string;
size: integer;
begin
LookupAccountName('TAZ',PChar(Edit1.Text),nil,SidLen,nil,DomenLen,SidNameUse);
GetMem(pcsid,SidLen);
sid := PSID(pcsid);
GetMem(DomenName,DomenLen);
if LookupAccountName('TAZ',PChar(Edit1.Text),sid,SidLen,DomenName,DomenLen,SidNameUse) then
begin
ShowMessage('Successfully SID!');
end
else begin
ShowMessage('A system error has occurred: ' + SysErrorMessage(GetLastError));
end;
GetMem(pSD, SECURITY_DESCRIPTOR_MIN_LENGTH);
if InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION) then
begin
ShowMessage('Security Descriptor Initialized Successfully!');
end
else begin
ShowMessage('A system error has occurred: ' + SysErrorMessage(GetLastError));
end;
Len_Acl := sizeof(ACL) + sizeof(ACCESS_ALLOWED_ACE)
+ GetLengthSid(sid) - sizeof(DWORD) ;
if InitializeACL(@theACL, Len_ACL, ACL_REVISION) then
begin
ShowMessage('ACL Initialized Successfully!');
end
else begin
ShowMessage('A system error has occurred: ' + SysErrorMessage(GetLastError));
end;
if AddAccessAllowedACE(@theACL, ACL_REVISION, $1F0000, sid) then
begin
ShowMessage('Allowed ACE added Successfully!');
end
else begin
ShowMessage('A system error has occurred: ' + SysErrorMessage(GetLastError));
end;
if SetSecurityDescriptorDacl(pSD,true,@theACL,false) then
begin
ShowMessage('Security Descriptor DACL set Successfully!');
end
else begin
ShowMessage('A system error has occurred: ' + SysErrorMessage(GetLastError));
end;
s := 'TestShare';
size := SizeOf(WideChar) * (length(s)+1);
GetMem(wcnetname,size);
wcnetname := StringToWideChar(s,wcnetname,length(s)+1);
s := 'Remark for share';
size := SizeOf(WideChar) * (length(s)+1);
GetMem(wcremark,size);
wcremark := StringToWideChar(s,wcremark,length(s)+1);
s := 'W:\Share'; // + '\' + Edit1.Text;
size := SizeOf(WideChar) * (length(s)+1);
GetMem(wcpath,size);
wcpath := StringToWideChar(s,wcpath,length(s)+1);
p.shi502_netname := PChar(wcnetname);
p.shi502_type := STYPE_DISKTREE;
p.shi502_remark := PChar(wcremark);
p.shi502_permissions := ACCESS_WRITE;
p.shi502_max_uses := 4;
p.shi502_current_uses := 0;
p.shi502_path := PChar(wcpath);
p.shi502_passwd := nil;
p.shi502_reserved := 0;
p.shi502_security_descriptor := pSD;
nStatus := NetShareAdd('TAZ',502,@p,parm_err);
if (nStatus = NERR_Success) then
begin
ShowMessage('Share added Successfully!');
end
else begin
ShowMessage('A system error has occurred: ' + SysErrorMessage(nStatus));
end;
end;
ja (2004-11-18 01:21:00) [1]Вопрос снят! Поборол-таки самостоятельно! =)