LSASS_API DWORD LsaSetMachineName( HANDLE hLsaConnection, PCSTR pszMachineName ) { DWORD dwError = 0; size_t sNameLen = 0; BAIL_ON_INVALID_POINTER(pszMachineName); sNameLen = strlen(pszMachineName); if (sNameLen == 0) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_LSA_ERROR(dwError); } dwError = LsaProviderIoControl(hLsaConnection, LSA_PROVIDER_TAG_LOCAL, LSA_LOCAL_IO_SETDOMAINNAME, (DWORD)(sNameLen + 1), (PVOID)pszMachineName, NULL, NULL); error: return dwError; }
DWORD LsaAdEmptyCache( IN HANDLE hLsaConnection, IN OPTIONAL PCSTR pszDomainName, IN BOOLEAN bForceOfflineDelete ) { DWORD dwError = 0; PSTR pszTargetProvider = NULL; if (geteuid() != 0) { dwError = LW_ERROR_ACCESS_DENIED; BAIL_ON_LSA_ERROR(dwError); } if (pszDomainName) { dwError = LwAllocateStringPrintf( &pszTargetProvider, "%s:%s:%d", LSA_PROVIDER_TAG_AD, pszDomainName, bForceOfflineDelete); BAIL_ON_LSA_ERROR(dwError); } else { dwError = LwAllocateStringPrintf( &pszTargetProvider, "%s::%d", LSA_PROVIDER_TAG_AD, bForceOfflineDelete); BAIL_ON_LSA_ERROR(dwError); } dwError = LsaProviderIoControl( hLsaConnection, pszTargetProvider, LSA_AD_IO_EMPTYCACHE, 0, NULL, NULL, NULL); BAIL_ON_LSA_ERROR(dwError); cleanup: LW_SAFE_FREE_STRING(pszTargetProvider); return dwError; error: goto cleanup; }
LSASS_API DWORD LsaAdRemoveGroupByIdFromCache( IN HANDLE hLsaConnection, IN OPTIONAL PCSTR pszDomainName, IN gid_t gid ) { DWORD dwError = 0; PSTR pszTargetProvider = NULL; if (geteuid() != 0) { dwError = LW_ERROR_ACCESS_DENIED; BAIL_ON_LSA_ERROR(dwError); } if (pszDomainName) { dwError = LwAllocateStringPrintf( &pszTargetProvider, "%s:%s", LSA_PROVIDER_TAG_AD, pszDomainName); BAIL_ON_LSA_ERROR(dwError); } dwError = LsaProviderIoControl( hLsaConnection, pszTargetProvider ? pszTargetProvider : LSA_PROVIDER_TAG_AD, LSA_AD_IO_REMOVEGROUPBYIDCACHE, sizeof(gid), &gid, NULL, NULL); BAIL_ON_LSA_ERROR(dwError); cleanup: LW_SAFE_FREE_STRING(pszTargetProvider); return dwError; error: goto cleanup; }
LSASS_API DWORD LsaAdEnumGroupsFromCache( IN HANDLE hLsaConnection, IN OPTIONAL PCSTR pszDomainName, IN PSTR* ppszResume, IN DWORD dwMaxNumGroups, OUT PDWORD pdwGroupsFound, OUT PLSA_SECURITY_OBJECT** pppObjects ) { DWORD dwError = 0; PSTR pszTargetProvider = NULL; DWORD dwOutputBufferSize = 0; PVOID pOutputBuffer = NULL; PVOID pBlob = NULL; size_t BlobSize = 0; LWMsgContext* context = NULL; LWMsgDataContext* pDataContext = NULL; LSA_AD_IPC_ENUM_GROUPS_FROM_CACHE_REQ request; PLSA_AD_IPC_ENUM_GROUPS_FROM_CACHE_RESP response = NULL; memset(&request, 0, sizeof(request)); if (geteuid() != 0) { dwError = LW_ERROR_ACCESS_DENIED; BAIL_ON_LSA_ERROR(dwError); } if (pszDomainName) { dwError = LwAllocateStringPrintf( &pszTargetProvider, "%s:%s", LSA_PROVIDER_TAG_AD, pszDomainName); BAIL_ON_LSA_ERROR(dwError); } // marshal the request request.pszResume = *ppszResume; request.dwMaxNumGroups = dwMaxNumGroups; dwError = MAP_LWMSG_ERROR(lwmsg_context_new(NULL, &context)); BAIL_ON_LSA_ERROR(dwError); dwError = MAP_LWMSG_ERROR(lwmsg_data_context_new(context, &pDataContext)); BAIL_ON_LSA_ERROR(dwError); dwError = MAP_LWMSG_ERROR(lwmsg_data_marshal_flat_alloc( pDataContext, LsaAdIPCGetEnumGroupsFromCacheReqSpec(), &request, &pBlob, &BlobSize)); BAIL_ON_LSA_ERROR(dwError); dwError = LsaProviderIoControl( hLsaConnection, pszTargetProvider ? pszTargetProvider : LSA_PROVIDER_TAG_AD, LSA_AD_IO_ENUMGROUPSCACHE, BlobSize, pBlob, &dwOutputBufferSize, &pOutputBuffer); BAIL_ON_LSA_ERROR(dwError); dwError = MAP_LWMSG_ERROR(lwmsg_data_unmarshal_flat( pDataContext, LsaAdIPCGetEnumGroupsFromCacheRespSpec(), pOutputBuffer, dwOutputBufferSize, (PVOID*)&response)); BAIL_ON_LSA_ERROR(dwError); *pdwGroupsFound = response->dwNumGroups; *pppObjects = response->ppObjects; response->ppObjects = NULL; if ( *ppszResume ) { LwFreeMemory(*ppszResume); *ppszResume = NULL; } *ppszResume = response->pszResume; response->pszResume = NULL; cleanup: if ( response ) { lwmsg_data_free_graph( pDataContext, LsaAdIPCGetEnumGroupsFromCacheRespSpec(), response); } if (pDataContext) { lwmsg_data_context_delete(pDataContext); } if ( context ) { lwmsg_context_delete(context); } if ( pBlob ) { LwFreeMemory(pBlob); } if ( pOutputBuffer ) { LwFreeMemory(pOutputBuffer); } LW_SAFE_FREE_STRING(pszTargetProvider); return dwError; error: if ( *ppszResume ) { LwFreeMemory(*ppszResume); *ppszResume = NULL; } *pdwGroupsFound = 0; *pppObjects = NULL; goto cleanup; }