热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

NetShareAdd设置共享文件成功,但别的机器无法访问,请大侠指教

intShareAdd::Run(){char*nfile;TODO:Addyourspecializedcodehereandorcallthe
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 个解决方案

#1


别的机器访问出现什么错误...是不是权限不对

#2


就是提示没有权限

#3


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");     

#4


p.shi2_permissiOns= ACCESS_ALL

推荐阅读
author-avatar
黄敬定241
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有