Форум — Ответы     (  К темам )
 ?  dr.phoenix: Почему глючит расшаривание? (15-04-2003 15:58:33)
Почему глючит расшаривание? Вот код:
////////////////////////////////////////
#include <lm.h>

void __fastcall TForm1::Button1Click(TObject *Sender)
{
NET_API_STATUS res;
SHARE_INFO_502 inf;

WCHAR wcName[MAX_PATH],wcRemark[MAX_PATH],wcPath[MAX_PATH],wcServ[MAX_PATH];
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED,"test_temp",-1,wcName,MAX_PATH);
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED,"c:\\temp",-1,wcPath,MAX_PATH);
//MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED,"slan",-1,wcServ,MAX_PATH);


memset(&inf, 0, sizeof(inf)); //Обнуляем структуру
inf.shi502_netname=wcName;
inf.shi502_type = STYPE_DISKTREE;
inf.shi502_remark =NULL;//wcRemark;
inf.shi502_permissions = ACCESS_READ; //////////// вот тут че-то не так, наверна
inf.shi502_max_uses = 5;
inf.shi502_current_uses = 0;
inf.shi502_path =wcPath;
inf.shi502_passwd = NULL;
inf.shi502_reserved = 0;
inf.shi502_security_descriptor = NULL;

res=NetShareAdd(NULL, //LocalComputer
2,
(LPBYTE) &inf,
NULL); //Не хотим знать доп. инф. об ошибке

if(res!=NERR_Success)Label1->Caption="не получилось";
}
/////////////////////////////////////////////////

Все расшаривается прекрано, но в функции написанно, что права должны быть тока для чтения, а прога ставит права на полный доступ :(
И еще константа ACCESS_READ в lmshare.h не определена, чисто случайно я ее обнаружил в lm.h. и нигде в справке я про это не нашел упоминаний. Вопрос какого черта структура SHARE_INFO502 определяется в одном хедере, о константы к ней в другом???
 Alexander (15-04-2003 16:43:25)
У тебя второй параметр — номер уровня — должен быть 502, а не 2, раз структура для такого уровня.
Насчет хедеров ты поди вон посмотри как в исходниках Unix все весело бывает.
Никогда не пробовал искать, какой хедер нужно подключить, для того, чтобы ИНСТАЛЛИРОВАТЬ СОФТ ? :)
 dr.phoenix (15-04-2003 18:03:02)
2Alexander
да, не заметил... Но после исправления оно все равно не работает как нада! :(
Все равно на полный доступ ставит :(
 Alexander (16-04-2003 11:42:06)
Слушай, у меня нет под рукой Win98. Но насколько я помню, если расшарить ресурс при share-level security и не дать ему никакого пароля, как у тебя, то он будет со всеми правами, и на запись в том числе, или я не прав ?
Еще совет — сделай руками то, что тебе надо, и вызови NetShareGetInfo .
И посмотри, что он возвратит и сравни со своей структурой.
 dr.phoenix (16-04-2003 21:38:00)
2 Alexander

перевое: NetShareAdd работает только в NT (по крайней мере так написанно)
второе : Я пробовал пароль ставить, но он чего-то не ставится :(
третье : Что за Share-level security?
 dr.phoenix (16-04-2003 23:30:39)
Блин, не могу понять че я делаю неправильно?
/////////
WCHAR wcShare[MAX_PATH]; //имя расшаренной папки
SHARE_INFO_502 getinf;//структура, в которую должны данные попасть
memset(&getinf,0,sizeof(getinf));//обнуляем структуру
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED,"test_temp",-1,wcServ,MAX_PATH);//преобразуем имя шары в WCHAR
NetShareGetInfo(NULL,wcShare,502,(LPBYTE *)&getinf);//получаем инфу
////////

но в getinf попадают совсем не те данные, которые должны быть там на самом деле.
По моему туду ваще просто мусор попадает :(
 Alexander (17-04-2003 16:00:34)
Слушай, ты не понял сути. Share-level security — это расшаривание ресурсов "по имени", т.е. каждый общий ресурс имеет сетевое имя (е.g. \\mycomp\printer1 , \\mycomp\cd и т.д.) и пароль к нему (возможно, не один, а парочку — на чтение и запись). Тогда и только тогда, в Win98 (в NT такого нету!) можно делать, как ты пытался.
В NT/2000/XP всегда и в Win98 при установленном режиме используется user-level security — права на общие ресурсы выдаются в соответствии со списками пользователей, группами пользователей и т.д. Например, можно выдать все права администраторам (локальной группе) или пользователю \\mycomp2\lenochka .
При этом авторизация только пользовательская, т.е. если у тебя есть права заданного уровня (скажем, ты входишь в группу локальных администраторов), то ты имеешь доступ к ресурсу.

Насчет Netsharegetinfo: в хелпе немного коряво написано, на самом деле тебе надо завести переменную — указатель на эту структуру (а не саму структуру), скажем
SHARE_INFO_502 *pShareInfo;
и передавать в функцию указатель на эту переменную (т.е. указатель на указатель!) — именно так расшифровывается LPBYTE *
т.е. NetShareGetInfo (...., &pShareInfo);
Потом — опять же см. help — надо освободить память через NetAPIBufferFree — потому что в переменную pShareInfo тебе запишут адрес внутреннего блока памяти, выделенного специально внутри функции.
 dr.phoenix (18-04-2003 15:32:30)
Ура! получилось расшарить папку тока на чтение. Получилось так: посмотрел на inf.shi502_security_descriptor у папки расшаренной ручками и поставил такой-же папке, расшариваемой из проги. И заработало! Потом я перезагрузился и работать перестало :( Оказалось что этот security_descriptor меняется время от времени. Пока что я вижу тока один способ расшаривать папки: держать одну папку расшаренную руками, чтоб смотреть у нее этот дескриптор и ставить такой же. Но мож есть нормальный способ? Как получить этот дескриптор другим способом??