static DWORD Add( int argc, char** ppszArgv ) { static const DWORD dwLevel = 502; DWORD dwError = 0; SHARE_INFO_502 shareInfo = {0}; DWORD dwParmErr = 0; PSECURITY_DESCRIPTOR_RELATIVE pSecDesc = NULL; DWORD dwSecDescSize = 0; dwError = ParseShareArgs( argc, ppszArgv); BAIL_ON_SRVSVC_ERROR(dwError); dwError = ConstructSecurityDescriptor( gState.dwAllowUserCount, gState.ppwszAllowUsers, gState.dwDenyUserCount, gState.ppwszDenyUsers, gState.bReadOnly && !gState.bReadWrite, &pSecDesc, &dwSecDescSize); BAIL_ON_SRVSVC_ERROR(dwError); shareInfo.shi502_type = 0; // SHARE_SERVICE_DISK_SHARE shareInfo.shi502_netname = gState.pwszName ? gState.pwszName : gState.pwszTarget; shareInfo.shi502_remark = gState.pwszComment; shareInfo.shi502_path = gState.pwszPath; shareInfo.shi502_reserved = dwSecDescSize; shareInfo.shi502_security_descriptor = (PBYTE) pSecDesc; dwError = NetShareAdd( gState.pwszServerName, dwLevel, &shareInfo, &dwParmErr); BAIL_ON_SRVSVC_ERROR(dwError); cleanup: LW_SAFE_FREE_MEMORY(pSecDesc); return dwError; error: goto cleanup; }
DWORD NetExecShareAdd( NET_SHARE_ADD_OR_SET_INFO_PARAMS ShareAddInfo ) { static const DWORD dwLevel = 502; DWORD dwError = 0; SHARE_INFO_502 shareInfo = {0}; DWORD dwParmErr = 0; PSECURITY_DESCRIPTOR_RELATIVE pSecDesc = NULL; DWORD dwSecDescSize = 0; dwError = ConstructSecurityDescriptor( ShareAddInfo.dwAllowUserCount, ShareAddInfo.ppwszAllowUsers, ShareAddInfo.dwDenyUserCount, ShareAddInfo.ppwszDenyUsers, ShareAddInfo.bReadOnly && !ShareAddInfo.bReadWrite, &pSecDesc, &dwSecDescSize); BAIL_ON_LTNET_ERROR(dwError); shareInfo.shi502_netname = ShareAddInfo.pwszShareName ? ShareAddInfo.pwszShareName : ShareAddInfo.pwszTarget; shareInfo.shi502_path = ShareAddInfo.pwszPath; shareInfo.shi502_type = 0; // SHARE_SERVICE_DISK_SHARE shareInfo.shi502_remark = ShareAddInfo.pwszComment; shareInfo.shi502_reserved = dwSecDescSize; shareInfo.shi502_security_descriptor = (PBYTE) pSecDesc; dwError = NetShareAddW( ShareAddInfo.pwszServerName, dwLevel, (PBYTE)&shareInfo, &dwParmErr); BAIL_ON_LTNET_ERROR(dwError); cleanup: LTNET_SAFE_FREE_MEMORY(pSecDesc); return dwError; error: goto cleanup; }
DWORD NetExecSetInfo( NET_SHARE_ADD_OR_SET_INFO_PARAMS ShareSetInfo ) { static const DWORD dwLevel = 502; DWORD dwError = 0; SHARE_INFO_502 newShareInfo = {0}; PSHARE_INFO_502 pShareInfo = NULL; DWORD dwParmErr = 0; PSECURITY_DESCRIPTOR_RELATIVE pSecDesc = NULL; DWORD dwSecDescSize = 0; DWORD dwAllowUserCount = 0; PWSTR* ppwszAllowUsers = NULL; DWORD dwDenyUserCount = 0; PWSTR* ppwszDenyUsers = NULL; BOOLEAN bReadOnly = FALSE; dwError = NetShareGetInfoW( ShareSetInfo.pwszServerName, ShareSetInfo.pwszShareName, dwLevel, (PBYTE*)(&pShareInfo)); BAIL_ON_LTNET_ERROR(dwError); dwError = DeconstructSecurityDescriptor( pShareInfo->shi502_reserved, (PSECURITY_DESCRIPTOR_RELATIVE) pShareInfo->shi502_security_descriptor, &dwAllowUserCount, &ppwszAllowUsers, &dwDenyUserCount, &ppwszDenyUsers, &bReadOnly); BAIL_ON_LTNET_ERROR(dwError); newShareInfo = *pShareInfo; if (ShareSetInfo.pwszShareName) { newShareInfo.shi502_netname = ShareSetInfo.pwszShareName; } if (ShareSetInfo.pwszComment) { newShareInfo.shi502_remark = ShareSetInfo.pwszComment; } if (ShareSetInfo.pwszPath) { newShareInfo.shi502_path = ShareSetInfo.pwszPath; } dwError = ConstructSecurityDescriptor( ShareSetInfo.dwAllowUserCount || ShareSetInfo.bClearAllow ? ShareSetInfo.dwAllowUserCount : dwAllowUserCount, ShareSetInfo.dwAllowUserCount || ShareSetInfo.bClearAllow ? ShareSetInfo.ppwszAllowUsers : ppwszAllowUsers, ShareSetInfo.dwDenyUserCount || ShareSetInfo.bClearDeny ? ShareSetInfo.dwDenyUserCount : dwDenyUserCount, ShareSetInfo.dwDenyUserCount || ShareSetInfo.bClearDeny ? ShareSetInfo.ppwszDenyUsers : ppwszDenyUsers, ShareSetInfo.bReadOnly || ShareSetInfo.bReadWrite ? (ShareSetInfo.bReadOnly && !ShareSetInfo.bReadWrite) : bReadOnly, &pSecDesc, &dwSecDescSize); BAIL_ON_LTNET_ERROR(dwError); newShareInfo.shi502_type = pShareInfo->shi502_type; newShareInfo.shi502_reserved = dwSecDescSize; newShareInfo.shi502_security_descriptor = (PBYTE) pSecDesc; dwError = NetShareSetInfoW( ShareSetInfo.pwszServerName, ShareSetInfo.pwszShareName, dwLevel, (PBYTE)&newShareInfo, &dwParmErr); BAIL_ON_LTNET_ERROR(dwError); cleanup: if (pShareInfo) { LwNetFreeMemory(pShareInfo); } LwNetFreeWC16StringArray(dwAllowUserCount, ppwszAllowUsers); LwNetFreeWC16StringArray(dwDenyUserCount, ppwszDenyUsers); LTNET_SAFE_FREE_MEMORY(pSecDesc); return dwError; error: goto cleanup; }
static DWORD SetInfo( int argc, char** ppszArgv ) { static const DWORD dwLevel = 502; DWORD dwError = 0; SHARE_INFO_502 newShareInfo = {0}; PSHARE_INFO_502 pShareInfo = NULL; DWORD dwParmErr = 0; PSECURITY_DESCRIPTOR_RELATIVE pSecDesc = NULL; DWORD dwSecDescSize = 0; DWORD dwAllowUserCount = 0; PWSTR* ppwszAllowUsers = NULL; DWORD dwDenyUserCount = 0; PWSTR* ppwszDenyUsers = NULL; BOOLEAN bReadOnly = FALSE; dwError = ParseShareArgs( argc, ppszArgv); BAIL_ON_SRVSVC_ERROR(dwError); dwError = NetShareGetInfo( gState.pwszServerName, gState.pwszTarget, dwLevel, OUT_PPVOID(&pShareInfo)); BAIL_ON_SRVSVC_ERROR(dwError); dwError = DeconstructSecurityDescriptor( pShareInfo->shi502_reserved, (PSECURITY_DESCRIPTOR_RELATIVE) pShareInfo->shi502_security_descriptor, &dwAllowUserCount, &ppwszAllowUsers, &dwDenyUserCount, &ppwszDenyUsers, &bReadOnly); BAIL_ON_SRVSVC_ERROR(dwError); newShareInfo = *pShareInfo; if (gState.pwszName) { newShareInfo.shi502_netname = gState.pwszName; } if (gState.pwszComment) { newShareInfo.shi502_remark = gState.pwszComment; } if (gState.pwszPath) { newShareInfo.shi502_path = gState.pwszPath; } dwError = ConstructSecurityDescriptor( gState.dwAllowUserCount || gState.bClearAllow ? gState.dwAllowUserCount : dwAllowUserCount, gState.dwAllowUserCount || gState.bClearAllow ? gState.ppwszAllowUsers : ppwszAllowUsers, gState.dwDenyUserCount || gState.bClearDeny ? gState.dwDenyUserCount : dwDenyUserCount, gState.dwDenyUserCount || gState.bClearDeny ? gState.ppwszDenyUsers : ppwszDenyUsers, gState.bReadOnly || gState.bReadWrite ? (gState.bReadOnly && !gState.bReadWrite) : bReadOnly, &pSecDesc, &dwSecDescSize); BAIL_ON_SRVSVC_ERROR(dwError); newShareInfo.shi502_type = pShareInfo->shi502_type; newShareInfo.shi502_reserved = dwSecDescSize; newShareInfo.shi502_security_descriptor = (PBYTE) pSecDesc; dwError = NetShareSetInfo( gState.pwszServerName, gState.pwszTarget, dwLevel, &newShareInfo, &dwParmErr); BAIL_ON_SRVSVC_ERROR(dwError); cleanup: if (pShareInfo) { SrvSvcFreeMemory(pShareInfo); } FreeStringArray(dwAllowUserCount, ppwszAllowUsers); FreeStringArray(dwDenyUserCount, ppwszDenyUsers); LW_SAFE_FREE_MEMORY(pSecDesc); return dwError; error: goto cleanup; }