Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Создание шары для определенного пользователя [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]

Вопрос снят! Поборол-таки самостоятельно! =)


Наверх

Титульная страница Поиск, карта сайта Написать письмо