static DWORD LsaUnjoinDomain( IN PCWSTR pwszDnsDomainName, IN PCWSTR pwszMachineSamAccountName, IN OPTIONAL PCWSTR pwszUserName, IN OPTIONAL PCWSTR pwszUserDomain, IN OPTIONAL PCWSTR pwszUserPassword, IN DWORD dwUnjoinFlags ) { DWORD dwError = ERROR_SUCCESS; NTSTATUS ntStatus = STATUS_SUCCESS; PWSTR pwszDCName = NULL; PIO_CREDS pCreds = NULL; dwError = LsaGetRwDcName(pwszDnsDomainName, FALSE, &pwszDCName); BAIL_ON_LSA_ERROR(dwError); /* disable the account only if requested */ if (dwUnjoinFlags & LSAJOIN_ACCT_DELETE) { if (pwszUserName && pwszUserPassword) { ntStatus = LwIoCreatePlainCredsW(pwszUserName, pwszUserDomain, pwszUserPassword, &pCreds); dwError = LwNtStatusToWin32Error(ntStatus); BAIL_ON_LSA_ERROR(dwError); } else { ntStatus = LwIoGetActiveCreds(NULL, &pCreds); dwError = LwNtStatusToWin32Error(ntStatus); BAIL_ON_LSA_ERROR(dwError); } ntStatus = LsaDisableMachineAccount(pwszDCName, pCreds, pwszMachineSamAccountName); dwError = LwNtStatusToWin32Error(ntStatus); BAIL_ON_LSA_ERROR(dwError); } error: LSA_ASSERT(!ntStatus || dwError); LW_SAFE_FREE_MEMORY(pwszDCName); if (pCreds) { LwIoDeleteCreds(pCreds); } return dwError; }
NTSTATUS LwIoCreatePlainCredsA( PCSTR pszUsername, PCSTR pszDomain, PCSTR pszPassword, PIO_CREDS* ppCreds ) { NTSTATUS Status = STATUS_SUCCESS; PWSTR pwszUsername = NULL; PWSTR pwszDomain = NULL; PWSTR pwszPassword = NULL; Status = LwRtlWC16StringAllocateFromCString(&pwszUsername, pszUsername); BAIL_ON_NT_STATUS(Status); Status = LwRtlWC16StringAllocateFromCString(&pwszDomain, pszDomain); BAIL_ON_NT_STATUS(Status); Status = LwRtlWC16StringAllocateFromCString(&pwszPassword, pszPassword); BAIL_ON_NT_STATUS(Status); Status = LwIoCreatePlainCredsW(pwszUsername, pwszDomain, pwszPassword, ppCreds); BAIL_ON_NT_STATUS(Status); error: IO_SAFE_FREE_MEMORY(pwszUsername); IO_SAFE_FREE_MEMORY(pwszDomain); IO_SAFE_FREE_MEMORY(pwszPassword); return Status; }