作者:黄敬定241 | 来源:互联网 | 2023-05-18 21:48
int ShareAdd::Run()
{ char * n="file";
// TODO: Add your specialized code here and/or call the base class
DWORD res=1;
SHARE_INFO_2 p;
USES_CONVERSION;
LPWSTR pwShareName=A2W(n);
//char * pwd="123456";
// LPWSTR password=A2W(pwd);
char * path="D:\\zhanzhaolei";
LPWSTR pathurl=A2W(path);
//p=new SHARE_INFO_2;
DWORD parm_err = 0;
p.shi2_current_uses=0;
p.shi2_max_uses=66;
p.shi2_netname=(LPTSTR)pwShareName;
//p.shi2_passwd=(LPTSTR)password;
p.shi2_passwd=NULL;
p.shi2_path=(LPTSTR)pathurl;
p.shi2_permissiOns=ACCESS_CREATE;
p.shi2_remark=NULL;
p.shi2_type=STYPE_DISKTREE;
res=NetShareAdd(NULL,2,(LPBYTE)&p,&parm_err);
if(res==0)
{
m_Ower->m_List.AddString("111");
}
else
{
m_Ower->m_List.AddString("222");
}
return 0;
//return CWinThread::Run();
}
4 个解决方案
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");
p.shi2_permissiOns=
ACCESS_ALL;