要求代码运行在具有管理员权限的账户下。 PSID pSid = NULL; // 定义一个指向SID结构的指针 DWORD cbSid; // 存放SID的长度 (in bytes) TCHAR RefDomain[DNLEN + 1]; // 缓冲区用来存放所在域的名称 DWORD cchDomain = DNLEN + 1;// 可以存入缓冲区的字符的个数 (in TCHARs) SID_NAME_USE peUse; // 一个枚举类型,用来指出SID的类型 SECURITY_DESCRIPTOR sd; // 用来描述安全属性的结构 PACL pDacl = NULL; // 指向权限控制列表的指针 DWORD dwAclSize ; // 列表的长度; LPTSTR Username = _T( "everyone ");//设定可以访问到此共享资源的用户或组 SHARE_INFO_502 si502; // 这是一个结构,用来描述共享资源共资源 享属性 NET_API_STATUS res; //用来显示调用相关函数后的结果,指示调用是否成功 WCHAR* szShareName=L "ShareDatabase ";//显示在网络上的共享名 WCHAR* szSharePath =L "f:// "; // 欲共享的目录 cbSid = 96; // 设定SID的长度为96 pSid = (PSID)HeapAlloc(GetProcessHeap(), 0, cbSid); //为SID分配空间 if(pSid == NULL) //错误处理 { AfxMessageBox(_T( "HeapAlloc error!/n ")); } // 得到可以访问此资源的用户或组的SID. if(!LookupAccountName(NULL, // [in] 这个参数指明查找的用户或组在哪个系统上,为NULL表示本地系统 Username, // [in] 欲授予访问权限的用户或组 pSid, // [out] 存放返回的SID值 &cbSid, // [in,out] 进去的是你设定的缓冲区长度,出来的是实际SID的长度 RefDomain, // [out] 域名 &cchDomain,// [in,out] 长度 &peUse )) // [out] 结构,用来指示用户的类型 { if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) // 如果缓冲区不足, try again { pSid = (PSID)HeapReAlloc(GetProcessHeap(), 0, pSid, cbSid); if(pSid == NULL) { AfxMessageBox(_T( "HeapReAlloc error!/n ")); } cchDomain = DNLEN + 1; if(!LookupAccountName(NULL, Username, pSid, &cbSid, RefDomain, &cchDomain, &peUse )) { AfxMessageBox(_T( "LookupAccountName error! (rc=%lu)/n "), GetLastError()); } } else { AfxMessageBox(_T( "LookupAccountName error! (rc=%lu)/n "), GetLastError()); } } // 计算权限控制列表所需长度 dwAclSize = sizeof(ACL) +1 * ( sizeof(ACCESS_ALLOWED_ACE) - sizeof(DWORD) ) + GetLengthSid(pSid) ; // 为pDacl分配所需的空间 pDacl = (PACL)HeapAlloc(GetProcessHeap(), 0, dwAclSize); if(pDacl == NULL) return; // 将pDacl初始化 InitializeAcl(pDacl, dwAclSize, ACL_REVISION); // 授予GENERIC_ALL 权限授于得到的SID,并加入到列表中 AddAccessAllowedAce(pDacl,ACL_REVISION,GENERIC_ALL,pSid); // 初始化 SECURITY_DESCRIPTOR 结构的实例sd InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION) ; // 将pDacl加入到sd中 SetSecurityDescriptorDacl(&sd, TRUE, pDacl, FALSE); // 填充SHARE_INFO_502 结构 si502.shi502_netname =(char*) szShareName; // 共享名 si502.shi502_type = STYPE_DISKTREE; // 资源类型--文件 si502.shi502_remark = NULL; // 别名 si502.shi502_max_uses = SHI_USES_UNLIMITED;// 最大连接数 si502.shi502_permissions = ACCESS_ALL; // 访问权限 si502.shi502_current_uses = 0; // 当前连接 si502.shi502_path = (char*) szSharePath; // 共享的目录 si502.shi502_passwd = NULL; // 访问密码 si502.shi502_reserved = 0; // 保留字段 si502.shi502_security_descriptor = &sd; // 安全描述符 // 将资源共享 res = NetShareAdd( NULL, // NULL表示共享资源在本地系统上 502, // 表示共享信息描述用SHARE_INFO_502结构 (LPBYTE)&si502, // 存放SHARE_INFO_502结构的缓冲区 NULL // 存放错误信息,可以不用 ); // 根据返回信息,判断共享操作是否成功 if(res==NERR_Success) AfxMessageBox( "Share created "); else if(res==ERROR_ACCESS_DENIED) AfxMessageBox( "The user does not have access to the requested information "); else if(res==ERROR_INVALID_LEVEL) AfxMessageBox( "The value specified for the level parameter is invalid. "); else if(res==ERROR_INVALID_NAME) AfxMessageBox( "The character or file system name is invalid. "); else if(res==ERROR_INVALID_PARAMETER) AfxMessageBox( "The specified parameter is invalid. "); else if(NERR_DuplicateShare==res) AfxMessageBox( "The share name is already in use on this server. "); else if(NERR_RedirectedPath==res) AfxMessageBox( "The operation is invalid for a redirected resource. The specified device name is assigned to a shared resource. "); else if(NERR_UnknownDevDir==res) AfxMessageBox( "The device or directory does not exist. "); else AfxMessageBox( "dfdfd ");