zhiye_wang

向星空仰望的越深,越发现自己的渺小

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  31 随笔 :: 1 文章 :: 2 评论 :: 0 Trackbacks
调用API函数NetShareAdd()将文件夹设置为共享,调用此函数后如果不做其他设置,网络用户是无法访问共享文件夹的,因为此文件夹在NTFS分区中,同时受到NTFS文件系统的访问控制,因此还需要第2步;
调用DOS命令cacls,赋予Guest用户组读写权限;
如果要取消文件共享,直接调用API函数NetShareDel()

对于FAT32分区中文件夹,cacls命令是不起作用的,这个命令专用于NTFS格式下的文件和文件夹。也就是说上面这种解决方法的第步不能用了,那么现在只能使用NetShareAdd()函数添加文件共享。调用此函数后如果不做其他设置,网络用户可以访问共享文件夹,但拥有完全控制权限(这是默认的共享权限设置),而在实际项目中我们希望能够编程控制读写权限。在NTFS分区中,我们还有NTFS文件系统的访问控制功能罩着,在FAT32分区中就只能依赖于操作系统文件夹共享自身的权限设置功能了。
 1NET_API_STATUS NetShareAdd(
 2_In_   LPWSTR servername,
 3_In_   DWORD level,
 4_In_   LPBYTE buf,
 5_Out_  LPDWORD parm_err
 6);
 7typedef struct _SHARE_INFO_2 {
 8LPWSTR shi2_netname;
 9DWORD  shi2_type;
10LPWSTR shi2_remark;
11DWORD  shi2_permissions;
12DWORD  shi2_max_uses;
13DWORD  shi2_current_uses;
14LPWSTR shi2_path;
15LPWSTR shi2_passwd;
16}
 SHARE_INFO_2, *PSHARE_INFO_2, *LPSHARE_INFO_2;

addShare.cpp

 1// 说明:
 2// FAT 系统调用此函数,shi502_permissions参数无效。有且仅有共享权限为最高权限。
 3// NTFS 系统调用此函数,请修改shi502_permissions参数,可使用如下权限:
 4// ACCESS_READ, ACCESS_WRITE, ACCESS_CREATE, ACCESS_EXEC
 5// ACCESS_DELETE, ACCESS_ATRIB, ACCESS_PERM, ACCESS_ALL
 6BOOL addShare(LPTSTR lpShareName, LPTSTR lpShareDir)
 7{
 8NET_API_STATUS res;
 9SHARE_INFO_502 p;
10 
11p.shi502_netname = lpShareName; //共享名
12p.shi502_type = STYPE_DISKTREE; 
13p.shi502_remark = NULL;
14p.shi502_permissions = ACCESS_ALL;
15p.shi502_max_uses = SHI_USES_UNLIMITED; //最大链接数
16p.shi502_current_uses = 0;
17p.shi502_path = lpShareDir; //需要共享的路径
18p.shi502_passwd = NULL;
19p.shi502_reserved = 0;
20p.shi502_security_descriptor = NULL;
21 
22res = NetShareAdd(NULL, 502, (LPBYTE)&p, NULL);
23 
24if (NERR_Success == res)
25{
26printf("Share created.\n");
27}

28else
29{
30printf("NetShareAdd error: %u\n", res);
31}

32return (res==NERR_Success);
33}

34

delShare.cpp
 
 1BOOL delShare(LPTSTR lpShareName)
 2{
 3    NET_API_STATUS res;
 4    //TCHAR szShareName[256] = "TestShare";
 5    //TCHAR szShreDir[256] = "F:\\Media";
 6    res = NetShareDel(NULL, (LMSTR)lpShareName, 0);
 7    if (NERR_Success == res)
 8    {
 9        printf("NetShareDel ok.\n");
10    }

11    else
12    {
13        printf("NetShareDel error: %u\n", res);
14        if (ERROR_ACCESS_DENIED == res)
15        {
16            printf("The user does not have access to the requested information.\n");
17        }

18        if (NERR_NetNameNotFound == res)
19        {
20            printf("The share name does not exist.\n");
21        }

22    }

23    return (res==NERR_Success);
24}

posted on 2014-12-23 17:53 zhiye_wang 阅读(261) 评论(0)  编辑 收藏 引用 所属分类: windows

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理