Форум — Ответы ( К темам )
? | 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 меняется время от времени. Пока что я вижу тока один способ расшаривать папки: держать одну папку расшаренную руками, чтоб смотреть у нее этот дескриптор и ставить такой же. Но мож есть нормальный способ? Как получить этот дескриптор другим способом??
|