Hi,
I have tried the following code and was able to see the sharing.
This simple function will add sharing for the specified user on the specified machine
Hope it will help.
P.S in the following example the machine Name, and Domain was changed to protect the yada yada yada.
cheers
Alfadhly
#include "stdafx.h"
#include "NetShareMFC.h"
#include < LM.h >
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define _UNICODE
#define RTN_OK 0
#define RTN_ERROR 13
#pragma comment ( lib, "Netapi32.lib")
CWinApp theApp;
using namespace std;
int CleanUp( PSECURITY_DESCRIPTOR pSid, PACL pAcl, BOOL bSuccess);
int ShareFolder( LPCSTR szDirectory, LPCSTR szShareName, LPCSTR szUserName, LPCSTR szServer);
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
cout << "Share folder returned " ;
cout << ShareFolder(
"c:\\temp"
, "alfadhly44$"
, "MYDOMAIN\\alfadhlyG"
,"\\\\MYMACHINE"
) ;
cout << endl;
}
return nRetCode;
}
int ShareFolder( LPCSTR szDirectory, LPCSTR szShareName, LPCSTR szUserName, LPCSTR szServer)
{
LPWSTR DirectoryToShare;
LPWSTR Sharename;
LPWSTR Username;
LPWSTR Server;
PSID pSid = NULL;
DWORD cbSid;
WCHAR RefDomain[DNLEN + 1];
DWORD cchDomain = DNLEN + 1;
SID_NAME_USE peUse;
SECURITY_DESCRIPTOR sd;
PACL pDacl = NULL;
DWORD dwAclSize;
SHARE_INFO_502 si502;
NET_API_STATUS nas;
BOOL bSuccess = FALSE;
DWORD dwString;
dwString = MultiByteToWideChar(CP_ACP, 0, szDirectory, -1, NULL, 0);
DirectoryToShare = (PWSTR)LocalAlloc(LMEM_FIXED, dwString * sizeof(WCHAR));
if(dwString == NULL)
return -1;
dwString = MultiByteToWideChar(CP_ACP, 0, szDirectory, -1, DirectoryToShare, dwString);
if(dwString == 0)
return -1;
dwString = MultiByteToWideChar(CP_ACP, 0, szShareName, -1, NULL, 0);
Sharename = (PWSTR)LocalAlloc(LMEM_FIXED, dwString * sizeof(WCHAR));
if(dwString == NULL)
return -1;
dwString = MultiByteToWideChar(CP_ACP, 0, szShareName, -1, Sharename, dwString);
if(dwString == 0)
return -1;
dwString = MultiByteToWideChar(CP_ACP, 0, szUserName, -1, NULL, 0);
Username = (PWSTR)LocalAlloc(LMEM_FIXED, dwString * sizeof(WCHAR));
if(dwString == NULL)
return -1;
dwString = MultiByteToWideChar(CP_ACP, 0, szUserName, -1, Username, dwString);
if(dwString == 0)
return -1;
if (lstrlen(szServer)>0)
{
dwString = MultiByteToWideChar(CP_ACP, 0, szServer, -1, NULL, 0);
Server = (PWSTR)LocalAlloc(LMEM_FIXED, dwString * sizeof(WCHAR));
if(dwString == NULL)
return -1;
dwString = MultiByteToWideChar(CP_ACP, 0, szServer, -1, Server, dwString);
if(dwString == 0)
return -1;
}
else
Server = NULL;
#define SID_SIZE 96
cbSid = SID_SIZE;
pSid = (PSID)HeapAlloc(GetProcessHeap(), 0, cbSid);
if(pSid == NULL) {
TRACE("HeapAlloc error!\n");
return RTN_ERROR;
}
if(!LookupAccountNameW(
NULL,
Username,
pSid,
&cbSid,
RefDomain,
&cchDomain,
&peUse
)) {
if(GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
pSid = (PSID)HeapReAlloc(GetProcessHeap(), 0, pSid, cbSid);
if(pSid == NULL) {
TRACE("HeapReAlloc error!\n");
return CleanUp( pSid, pDacl, FALSE);
}
cchDomain = DNLEN + 1;
if(!LookupAccountNameW(
NULL,
Username,
pSid,
&cbSid,
RefDomain,
&cchDomain,
&peUse
))
{
TRACE("LookupAccountName error! (rc=%lu)\n", GetLastError());
return CleanUp( pSid, pDacl, FALSE);
}
} else
{
TRACE("LookupAccountName error! (rc=%lu)\n", GetLastError());
return CleanUp( pSid, pDacl, FALSE);
}
}
dwAclSize = sizeof(ACL) +
1 * ( sizeof(ACCESS_ALLOWED_ACE) - sizeof(DWORD) ) +
GetLengthSid(pSid) ;
pDacl = (PACL)HeapAlloc(GetProcessHeap(), 0, dwAclSize);
if(pDacl == NULL) return CleanUp( pSid, pDacl, FALSE);
if(!InitializeAcl(pDacl, dwAclSize, ACL_REVISION))
return CleanUp( pSid, pDacl, FALSE);
if(!AddAccessAllowedAce(
pDacl,
ACL_REVISION,
GENERIC_ALL,
pSid
)) return CleanUp( pSid, pDacl, FALSE);
if(!InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION))
return CleanUp( pSid, pDacl, FALSE);
if(!SetSecurityDescriptorDacl(&sd, TRUE, pDacl, FALSE)) {
TRACE( "SetSecurityDescriptorDacl error! (rc=%lu)\n", GetLastError());
return CleanUp( pSid, pDacl, FALSE);
}
si502.shi502_netname = (LPTSTR) Sharename;
si502.shi502_type = STYPE_DISKTREE;
si502.shi502_remark = NULL;
si502.shi502_permissions = 0;
si502.shi502_max_uses = SHI_USES_UNLIMITED;
si502.shi502_current_uses = 0;
si502.shi502_path = (LPTSTR) DirectoryToShare;
si502.shi502_passwd = NULL;
si502.shi502_reserved = 0;
si502.shi502_security_descriptor = &sd;
nas = NetShareAdd(
(LPTSTR) Server,
502,
(LPBYTE)&si502,
NULL
);
if(nas != NO_ERROR) {
TRACE("NetShareAdd error! (rc=%lu)\n", nas);
return CleanUp( pSid, pDacl, FALSE);
}
return CleanUp( pSid, pDacl, TRUE);
}
int CleanUp( PSECURITY_DESCRIPTOR pSid, PACL pAcl, BOOL bSuccess)
{
if(pAcl != NULL)
HeapFree(GetProcessHeap(), 0, pAcl);
if(pSid != NULL)
HeapFree(GetProcessHeap(), 0, pSid);
if(!bSuccess) {
return RTN_ERROR;
}
return RTN_OK;
}
|