Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как отловить событие изменеия шаринга каталога?  (Прочитано 9737 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
ixania
Гость
« : 14-11-2003 18:09 » 

Подскажите, можно ли отловить факт расшаривания пользователем каталога и зашаривание обратно, и если можно, то каким образом.
Записан
Sommer
Молодой специалист

us
Offline Offline

« Ответ #1 : 14-11-2003 19:33 » 

хм... никогда таким не заниамлся..
но вот залез в МСДН - нашел такую функцию:
NET_API_STATUS NetShareCheck(
  LPWSTR servername,  
  LPWSTR device,      
  LPDWORD type        
);

Parameters
servername
[in] Pointer to a Unicode string specifying the name of the remote server on which the function is to execute. The string must begin with \\. If this parameter is NULL, the local computer is used.
device
[in] Pointer to a Unicode string specifying the name of the device to check for shared access.
type
[out] Pointer to an address that receives the type of the shared device. This parameter is set only if the function returns successfully. This parameter can be one of the following values. Value Meaning
STYPE_DISKTREE Disk drive
STYPE_PRINTQ Print queue
STYPE_DEVICE Communication device
STYPE_IPC Interprocess communication (IPC)
STYPE_SPECIAL Special share reserved for interprocess communication (IPC$) or remote administration of the server (ADMIN$). Can also refer to administrative shares such as C$, D$, E$, and so forth. For more information, see the network management share functions.


Return Values
If the function succeeds, the return value is NERR_Success.

If the function fails, the return value can be one of the following error codes.

Value Meaning
ERROR_NOT_ENOUGH_MEMORY Insufficient memory is available.
NERR_DeviceNotShared The device is not shared.
Записан

когда-нибудь, я верю, ты будешь ехать по этому городу и поймёшь, что хочешь увидеть меня за рулём мчащейся по соседней полосе машины.
но тогда меня уже не будет
в этом городе
forever yours.
ixania
Гость
« Ответ #2 : 14-11-2003 20:08 » 

Ет я все видел, сам туды лазил. Мне еад чтоб ваще отслеживать все какталоги, при помощи ентой функции придется сканить все подряд через промежутки времени.

WNetEnumResource тож пробовал но там слишком коряво получается.

FindFirstChangeNotification тож пробовал, работает только когда атрибуты безопасности меняются, но не шаринг.
Записан
ixania
Гость
« Ответ #3 : 17-11-2003 19:02 » new

Разобрался со своим вопросом, так что не хочу оставлять тему незаконченой то раскажу поподробней, делается енто так, можно с таймером а можно и без, можно просто создать thread с приоритетом THREAD_PRIORITY_IDLE в полне достаточно я пробовал либо THREAD_PRIORITY_LOWEST. Использовать над АПИшную функцию NetShareEnum, в NT осях она находится в NETAPI32.DLL в 95/98/МЕ SVRAPI.DLL. Сечас раскажу про NT оси про остальные попоже т.к. есть отличия.
Прототип NetShareEnum:

NET_API_STATUS NetShareEnum(
  LPWSTR servername,    
  DWORD level,          
  LPBYTE * bufptr,      
  DWORD prefmaxlen,      
  LPDWORD entriesread,  
  LPDWORD totalentries,  
  LPDWORD resume_handle,
);

В bufptr отдается указатель на одну из следующих структур:

typedef struct _SHARE_INFO_0 {
    LPWSTR    shi0_netname;
} SHARE_INFO_0, *PSHARE_INFO_0, *LPSHARE_INFO_0;
 
Members
shi0_netname
A Unicode string containing the sharename of a resource.

level = 0

=====================================================
typedef struct _SHARE_INFO_1 {
    LPWSTR    shi1_netname;
    DWORD     shi1_type;
    LPWSTR    shi1_remark;
} SHARE_INFO_1, *PSHARE_INFO_1, *LPSHARE_INFO_1;
 
Members
shi1_netname
A Unicode string containing the sharename of a resource.
shi1_type
This member can be one of following types. Value Meaning

STYPE_DISKTREE Disk drive
STYPE_PRINTQ Print queue
STYPE_DEVICE Communication device
STYPE_IPC Interprocess Communication (IPC)


shi1_remark
Points to a Unicode string containing an optional comment about the shared resource

level = 1, соответственно
=====================================================

typedef struct _SHARE_INFO_2 {
    LPWSTR    shi2_netname;
    DWORD     shi2_type;
    LPWSTR    shi2_remark;
    DWORD     shi2_permissions;
    DWORD     shi2_max_uses;
    DWORD     shi2_current_uses;
    LPWSTR    shi2_path;
    LPWSTR    shi2_passwd;
} SHARE_INFO_2, *PSHARE_INFO_2, *LPSHARE_INFO_2;
 
Members
shi2_netname
A Unicode string containing the sharename of a resource.
shi2_type
This member can be one of the following types: Value Meaning

STYPE_DISKTREE Disk drive
STYPE_PRINTQ Print queue
STYPE_DEVICE Communication device
STYPE_IPC Interprocess Communication (IPC)

shi2_remark
Points to a Unicode string that contains an optional comment about the shared resource.
shi2_permissions
Specifies the shared resource's permissions for servers running with share-level security. A server running user-level security ignores this member.This member can be one or more of the following values. Value Meaning
ACCESS_READ Permission to read data from a resource and, by default, to execute the resource.
ACCESS_WRITE Permission to write data to the resource.
ACCESS_CREATE Permission to create an instance of the resource (such as a file); data can be written to the resource as the resource is created.
ACCESS_EXEC Permission to execute the resource.
ACCESS_DELETE Permission to delete the resource.
ACCESS_ATRIB Permission to modify the resource's attributes (such as the date and time when a file was last modified).
ACCESS_PERM Permission to modify the permissions (read, write, create, execute, and delete) assigned to a resource for a user or application.
ACCESS_ALL Permission to read, write, create, execute, and delete resources, and to modify their attributes and permissions.

shi2_max_uses
Indicates the maximum number of concurrent connections that the shared resource can accommodate (unlimited if the value specified in shi2_max_uses is -1).
shi2_current_uses
Specifies the number of current connections to the resource.
shi2_path
Points to a Unicode string containing the local path for the shared resource. For disks, shi2_path is the path being shared. For print queues, shi2_path is the name of the print queue being shared.
shi2_passwd
Specifies the share's password (when the server is running with share-level security). If the server is running with user-level security, shi2_passwd is ignored. The shi2_passwd member can be no longer than SHPWLEN+1 bytes (including a terminating null character).

level = 2
=====================================================

typedef struct _SHARE_INFO_502 {
    LPWSTR    shi502_netname;
    DWORD     shi502_type;
    LPWSTR    shi502_remark;
    DWORD     shi502_permissions;
    DWORD     shi502_max_uses;
    DWORD     shi502_current_uses;
    LPWSTR    shi502_path;
    LPWSTR    shi502_passwd;
    DWORD     shi502_reserved;
    PSECURITY_DESCRIPTOR  shi502_security_descriptor;
} SHARE_INFO_502, *PSHARE_INFO_502, *LPSHARE_INFO_502;
 
Members
shi502_netname
A Unicode string containing the sharename of a resource.
shi502_type
One of the following four values specifying the type of share: Value Meaning

STYPE_DISKTREE Disk Drive
STYPE_PRINTQ Print Queue
STYPE_DEVICE Communication device
STYPE_IPC Interprocess Communication (IPC)


shi502_remark
Points to a Unicode string containing an optional comment about the shared resource.
shi502_permissions
Specifies the shared resource's permissions for servers running with share-level security.This member is ignored on a server running user-level security. This member can be any of the following values: Value Meaning
ACCESS_READ Permission to read data from a resource and, by default, to execute the resource.
ACCESS_WRITE Permission to write data to the resource.
ACCESS_CREATE Permission to create an instance of the resource (such as a file); data can be written to the resource as the resource is created.
ACCESS_EXEC Permission to execute the resource.
ACCESS_DELETE Permission to delete the resource.
ACCESS_ATRIB Permission to modify the resource's attributes (such as the date and time when a file was last modified).
ACCESS_PERM Permission to modify the permissions (read, write, create, execute, and delete) assigned to a resource for a user or application.
ACCESS_ALL Permission to read, write, create, execute, and delete resources, and to modify their attributes and permissions.


shi502_max_uses
Indicates the maximum number of concurrent connections that the shared resource can accommodate (unlimited if the value specified in shi502_max_uses is -1).
shi502_current_uses
Specifies the number of current connections to the resource.
shi502_path
Points to a Unicode string that contains the local path for the shared resource. For disks, shi502_path is the path being shared. For print queues, shi502_path is the name of the print queue being shared.
shi502_passwd
Specifies the share's password (when the server is running with share-level security). If the server is running with user-level security, shi502_passwd is ignored. The shi502_passwd member can be no longer than SHPWLEN+1 bytes (including a terminating null character).
shi502_reserved
Must be zero.
shi502_security_descriptor
Specifies the security descriptor associated with this share.

level = 502
=====================================================

Как видно level указывает какого типа переданный указатель, прошу заметить что передается пустой указатель, память под него выделать не надо, но вот после удачного вызова функции не забудьте освободить его.

Также рекомендую  после каждого вызова функции и обработки полученных структур вызвать Sleep (2000) в данном случае будет 2 секунды, думаю можно увеличить т.к. попробуцте зашарить чтото и посмотрите сколько енто времени занимает, уменя заняло секунд 12 ет без дополнительных настроек, так что и 10000 т.е. 10 секунд мы можем поспать т.е. частота обновления будет 6 раз за минуту, вполне достаточно но ет на ваше усмотрение.

Вот и таймера не надо Перекур , и ресурсов мало потребляем!
Записан
ixania
Гость
« Ответ #4 : 21-11-2003 04:11 » 

... продолжение, как обещал, раскажу также про 95/98/МЕ форточки. Как уже говорил есть отличия от NT систем  и не только в том что в разных библиотеках находится функция. Как оказывается прототип функции отличается и он следующий

DWORD NetShareEnum(
  LPSTR servername,
  DWORD level,
  void* bufptr,
  DWORD prefmaxlen,
  LPDWORD entriesread,
  LPDWORD totalentries
);

В bufptr не отдается указатель на указатель а сам указатель, на масив структур, над заметить что указатель уже должен указывать на масив структур в отличие от NT систем, где функция сама выделяет память, в этом и суть разницы передачи указателей. Структура имеет следующий вид:

typedef struct _SHARE_INFO_50{
  char  shi50_netname[12];
  BYTE  shi50_type;
  WORD  shi50_flags;
  LPSTR shi50_remark;
  LPSTR shi50_path;
  char shi50_rw_password[8];
  char shi50_ro_password[8];
} SHARE_INFO_50, *LPSHARE_INFO_50;

Соответственно  level = 50, насколько я знаю другие не потдерживаются.
Записан
ixania
Гость
« Ответ #5 : 21-11-2003 04:12 » 

Ну для наглядности кусок кода который показывает как это работает.

typedef struct _SHARE_INFO_50{
  char  shi50_netname[12];
  BYTE  shi50_type;
  WORD  shi50_flags;
  LPSTR shi50_remark;
  LPSTR shi50_path;
  char shi50_rw_password[8];
  char shi50_ro_password[8];
} SHARE_INFO_50, *LPSHARE_INFO_50;

typedef struct _SHARE_INFO_2 {
    LPWSTR    shi2_netname;
    DWORD     shi2_type;
    LPWSTR    shi2_remark;
    DWORD     shi2_permissions;
    DWORD     shi2_max_uses;
    DWORD     shi2_current_uses;
    LPWSTR    shi2_path;
    LPWSTR    shi2_passwd;
} SHARE_INFO_2, *LPSHARE_INFO_2;


DWORD (_stdcall *NetShareEnumNT) (LPWSTR servername, DWORD level, LPBYTE* bufptr, DWORD prefmaxlen, LPDWORD entriesread, LPDWORD totalentries, LPDWORD resume_handle);

DWORD (_stdcall *NetShareEnum) (LPSTR servername, DWORD level, void* bufptr, DWORD prefmaxlen, LPDWORD entriesread, LPDWORD totalentries);


 OSVERSIONINFO os_info;

 os_info.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);

  HANDLE  lib = NULL;
  NetShareEnum = NULL;
  NetShareEnumNT = NULL;

    if (GetVersionEx(&os_info))
        switch (os_info.dwPlatformId){
          case VER_PLATFORM_WIN32_NT:
             lib = LoadLibrary("NETAPI32.DLL");
             if (lib) (FARPROC)NetShareEnumNT = GetProcAddress(lib, "NetShareEnum");
             break;
          case VER_PLATFORM_WIN32_WINDOWS:
             lib = LoadLibrary("SVRAPI.DLL");
             if (lib) (FARPROC)NetShareEnum = GetProcAddress(lib, "NetShareEnum");
             break;
        }

 
 LPSHARE_INFO_2 lpSI2 = 0;
 SHARE_INFO_50 lpSI50[512];

 DWORD entriesread;
 DWORD totalentries;

 if (NetShareEnumNT) // для  NT
     if (NetShareEnumNT (NULL, 2, (unsigned char**)&lpSI2, -1, &entriesread, &totalentries, NULL) == 0){
         if (entriesread > 0){
            // добавить свои код здесь
            delete lpSI2;
         }
     }


    if (NetShareEnum) // для 95/98/МЕ
     if (NetShareEnum (NULL, 50, &lpSI50, sizeof (lpSI50), &entriesread, &totalentries) == 0){
         if (entriesread > 0){
            // добавить свои код здесь
         }
     }
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines