static DWORD MapSidToName( HANDLE hLsa, PSID pSid, PWSTR* ppwszName ) { DWORD dwError = 0; PSTR pszSid = NULL; LSA_QUERY_LIST QueryList; PLSA_SECURITY_OBJECT* ppObjects = NULL; dwError = LwNtStatusToWin32Error( RtlAllocateCStringFromSid(&pszSid, pSid)); BAIL_ON_LTNET_ERROR(dwError); QueryList.ppszStrings = (PCSTR*) &pszSid; dwError = LsaFindObjects( hLsa, NULL, 0, LSA_OBJECT_TYPE_UNDEFINED, LSA_QUERY_TYPE_BY_SID, 1, QueryList, &ppObjects); BAIL_ON_LTNET_ERROR(dwError); if (ppObjects[0] == NULL) { dwError = LW_ERROR_NO_SUCH_OBJECT; BAIL_ON_LTNET_ERROR(dwError); } dwError = LwAllocateWc16sPrintfW( ppwszName, L"%s\\%s", ppObjects[0]->pszNetbiosDomainName, ppObjects[0]->pszSamAccountName); BAIL_ON_LTNET_ERROR(dwError); cleanup: LsaFreeSecurityObjectList(1, ppObjects); LTNET_SAFE_FREE_STRING(pszSid); return dwError; error: *ppwszName = NULL; goto cleanup; }
static DWORD MapNameToSid( HANDLE hLsa, PCWSTR pwszName, PSID* ppSid ) { DWORD dwError = 0; PSTR pszName = NULL; LSA_QUERY_LIST QueryList; PLSA_SECURITY_OBJECT* ppObjects = NULL; dwError = LwWc16sToMbs(pwszName, &pszName); BAIL_ON_LTNET_ERROR(dwError); QueryList.ppszStrings = (PCSTR*) &pszName; dwError = LsaFindObjects( hLsa, NULL, 0, LSA_OBJECT_TYPE_UNDEFINED, LSA_QUERY_TYPE_BY_NAME, 1, QueryList, &ppObjects); BAIL_ON_LTNET_ERROR(dwError); if (ppObjects[0] == NULL) { dwError = LW_ERROR_NO_SUCH_OBJECT; BAIL_ON_LTNET_ERROR(dwError); } dwError = LwNetAllocateSidFromCString(ppSid, ppObjects[0]->pszObjectSid); BAIL_ON_LTNET_ERROR(dwError); cleanup: LsaFreeSecurityObjectList(1, ppObjects); LTNET_SAFE_FREE_STRING(pszName); return dwError; error: *ppSid = NULL; goto cleanup; }
static DWORD NetShareAddParseArguments( int argc, char** argv, IN OUT PNET_SHARE_COMMAND_INFO pCommandInfo ) { DWORD dwError = 0; PCSTR pszPath = NULL; size_t sShareNameLen = 0; int indexShareAddArg = 3; // Do not free PCSTR pszShareAddShareInfo = NULL; PSTR pszShareName = NULL; if (!argv[indexShareAddArg]) { dwError = LW_ERROR_INVALID_PARAMETER; BAIL_ON_LTNET_ERROR(dwError); } if (!strncmp(argv[indexShareAddArg], "\\\\", sizeof("\\\\")-1)) { dwError = LwMbsToWc16s(argv[indexShareAddArg]+sizeof("\\\\")-1, &pCommandInfo->ShareAddOrSetInfo.pwszServerName); BAIL_ON_LTNET_ERROR(dwError); indexShareAddArg++; } if (indexShareAddArg > argc-1) { dwError = LW_ERROR_INVALID_PARAMETER; BAIL_ON_LTNET_ERROR(dwError); } pszShareAddShareInfo = argv[indexShareAddArg]; pszPath = strchr(pszShareAddShareInfo, '='); if (LTNET_IS_NULL_OR_EMPTY_STR(pszPath)) { dwError = LW_ERROR_INVALID_PARAMETER; BAIL_ON_LTNET_ERROR(dwError); } dwError = LwMbsToWc16s(pszPath+1, &pCommandInfo->ShareAddOrSetInfo.pwszPath); BAIL_ON_LTNET_ERROR(dwError); sShareNameLen = strlen(pszShareAddShareInfo)-strlen(pszPath); if (!sShareNameLen) { dwError = LW_ERROR_INVALID_PARAMETER; BAIL_ON_LTNET_ERROR(dwError); } dwError = LwNetAllocateMemory(sShareNameLen+1, (PVOID*)&pszShareName); BAIL_ON_LTNET_ERROR(dwError); memcpy(pszShareName, pszShareAddShareInfo, sShareNameLen); dwError = LwMbsToWc16s(pszShareName, &pCommandInfo->ShareAddOrSetInfo.pwszShareName); BAIL_ON_LTNET_ERROR(dwError); // Process add options dwError = ParseShareAddOrSetinfoOptionArgs(argc, ++indexShareAddArg, argv, pCommandInfo->dwControlCode, &pCommandInfo->ShareAddOrSetInfo); BAIL_ON_LTNET_ERROR(dwError); cleanup: LTNET_SAFE_FREE_STRING(pszShareName); return dwError; error: NetShareFreeCommandInfo(pCommandInfo); goto cleanup; }