Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.30;
Скачать: CL | DM;

Вниз

Создание шары для определенного пользователя   Найти похожие ветки 

 
ja ©   (2004-11-17 23:08) [0]

Уважаемые мастера! По вопросу создания шары опубликовано множество подсказок, пытался разобраться в 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) [1]

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



Страницы: 1 вся ветка

Текущий архив: 2005.01.30;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.026 c
1-1106131014
novill
2005-01-19 13:36
2005.01.30
Как заставить программы подождать несколько секунд?


1-1105950102
andrey__
2005-01-17 11:21
2005.01.30
Преобразование ANSI строку в ASCII строку


1-1105454109
odessey
2005-01-11 17:35
2005.01.30
А если принтеров несколько. Как назначить нужный?


1-1105708010
про
2005-01-14 16:06
2005.01.30
Kak svernut programku pri pervom ejo zapuske???


3-1103783014
Виталий Панасенко
2004-12-23 09:23
2005.01.30
Фильтрация таблицы dBase