大家好,
我需要在Windows 2008 64bit Web Server和Windows XP SP2上设一个目录为所有人可写。查了一下相关的资料写了如下的代码,执行过程中没有错误,该目录共享出来了,但是属性里的权限设置不对。从其他机器访问该目录也是Access Denied.有人
做个类似的工作吗?
#include <windows.h>
#include <atlsecurity.h>
#include <direct.h>
#include <lm.h>
#pragma comment(lib, "Netapi32.lib")
int main()
{
LPCTSTR local_folder = _T("c:\\testsharefolder");
int ret = _trmdir(local_folder);
if (ret != 0 )
{
ret = errno;
printf("%s failed to rmdir, error %d.\n", __FUNCTION__, ret);
//return ret;
}
CDacl local_folder_d;
local_folder_d.AddAllowedAce(Sids::Admins(), GENERIC_ALL, 0);
local_folder_d.AddAllowedAce(Sids::Guests(), GENERIC_WRITE, 0);
local_folder_d.AddAllowedAce(Sids::World(), GENERIC_WRITE, 0);
CSecurityDesc local_folder_sd;
local_folder_sd.SetDacl(local_folder_d);
CSecurityAttributes local_folder_sa;
local_folder_sa.Set(local_folder_sd);
BOOL cdret = CreateDirectory(local_folder, &local_folder_sa);
if (!cdret)
{
ret = GetLastError();
printf("Create directory error %d.\n", ret);
return ret;
}
CDacl share_d;
BYTE aceflags = 0/*CONTAINER_INHERIT_ACE|OBJECT_INHERIT_ACE*/;
share_d.AddAllowedAce(Sids::Guests(), GENERIC_WRITE, aceflags);
share_d.AddAllowedAce(Sids::World(), GENERIC_WRITE, aceflags);
CSecurityDesc share_sd;
share_sd.SetDacl(share_d);
PSECURITY_DESCRIPTOR psd_everyone_rw =
const_cast<SECURITY_DESCRIPTOR*>(share_sd.GetPSECURITY_DESCRIPTOR());
DWORD ulParmErr = 0;
SHARE_INFO_502 siShareInfo;
// Setup the share info structure.
siShareInfo.shi502_netname = L"TestShare";
siShareInfo.shi502_type = STYPE_DISKTREE;
siShareInfo.shi502_remark = (LPWSTR)local_folder;
siShareInfo.shi502_permissions = ACCESS_READ;
siShareInfo.shi502_max_uses = SHI_USES_UNLIMITED;
siShareInfo.shi502_current_uses = 0;
siShareInfo.shi502_path = (LPWSTR)local_folder;
siShareInfo.shi502_passwd = L"Abcd1234";
siShareInfo.shi502_reserved = 0;
siShareInfo.shi502_security_descriptor = psd_everyone_rw;
NET_API_STATUS res = NetShareAdd(NULL, // local machine
502, (LPBYTE) &siShareInfo, &ulParmErr);
if (res == NERR_Success)
{
printf("%s share successfully.", __FUNCTION__);
}
else
{
printf("%s share error message %d, parameter error code %d.",
__FUNCTION__,
res, ulParmErr);
return res;
}
return 0;
}
// cl main.cpp