aboutsummaryrefslogtreecommitdiff
path: root/src/ext/Util/ca/scaexec.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/ext/Util/ca/scaexec.cpp100
1 files changed, 21 insertions, 79 deletions
diff --git a/src/ext/Util/ca/scaexec.cpp b/src/ext/Util/ca/scaexec.cpp
index 5119bc11..8579b8bb 100644
--- a/src/ext/Util/ca/scaexec.cpp
+++ b/src/ext/Util/ca/scaexec.cpp
@@ -613,8 +613,7 @@ static HRESULT RemoveUserInternal(
613 LPWSTR pwz = NULL; 613 LPWSTR pwz = NULL;
614 LPWSTR pwzGroup = NULL; 614 LPWSTR pwzGroup = NULL;
615 LPWSTR pwzGroupDomain = NULL; 615 LPWSTR pwzGroupDomain = NULL;
616 LPCWSTR wz = NULL; 616 LPWSTR pwzDomainName = NULL;
617 PDOMAIN_CONTROLLER_INFOW pDomainControllerInfo = NULL;
618 617
619 // 618 //
620 // Remove the logon as service privilege. 619 // Remove the logon as service privilege.
@@ -644,30 +643,10 @@ static HRESULT RemoveUserInternal(
644 // 643 //
645 if (!(SCAU_DONT_CREATE_USER & iAttributes)) 644 if (!(SCAU_DONT_CREATE_USER & iAttributes))
646 { 645 {
647 if (wzDomain && *wzDomain) 646 hr = GetDomainFromServerName(&pwzDomainName, wzDomain, 0);
648 { 647 ExitOnFailure(hr, "Failed to get domain to remove user from server name: %ls", wzDomain);
649 er = ::DsGetDcNameW(NULL, (LPCWSTR)wzDomain, NULL, NULL, NULL, &pDomainControllerInfo);
650 if (RPC_S_SERVER_UNAVAILABLE == er)
651 {
652 // MSDN says, if we get the above error code, try again with the "DS_FORCE_REDISCOVERY" flag
653 er = ::DsGetDcNameW(NULL, (LPCWSTR)wzDomain, NULL, NULL, DS_FORCE_REDISCOVERY, &pDomainControllerInfo);
654 }
655 if (ERROR_SUCCESS == er)
656 {
657 if (2 <= wcslen(pDomainControllerInfo->DomainControllerName))
658 {
659 wz = pDomainControllerInfo->DomainControllerName + 2; // Add 2 so that we don't get the \\ prefix.
660 // Pass the entire string if it is too short
661 // to have a \\ prefix.
662 }
663 }
664 else
665 {
666 wz = wzDomain;
667 }
668 }
669 648
670 er = ::NetUserDel(wz, wzName); 649 er = ::NetUserDel(pwzDomainName, wzName);
671 if (NERR_UserNotFound == er) 650 if (NERR_UserNotFound == er)
672 { 651 {
673 er = NERR_Success; 652 er = NERR_Success;
@@ -707,52 +686,13 @@ static HRESULT RemoveUserInternal(
707 } 686 }
708 687
709LExit: 688LExit:
710 if (pDomainControllerInfo) 689 ReleaseStr(pwzDomainName);
711 { 690 ReleaseStr(pwzGroupDomain);
712 ::NetApiBufferFree(static_cast<LPVOID>(pDomainControllerInfo)); 691 ReleaseStr(pwzGroup);
713 }
714 692
715 return hr; 693 return hr;
716} 694}
717 695
718static void GetServerName(LPWSTR pwzDomain, LPWSTR* ppwzServerName)
719{
720 DWORD er = ERROR_SUCCESS;
721 PDOMAIN_CONTROLLER_INFOW pDomainControllerInfo = NULL;
722
723 if (pwzDomain && *pwzDomain)
724 {
725 er = ::DsGetDcNameW(NULL, (LPCWSTR)pwzDomain, NULL, NULL, NULL, &pDomainControllerInfo);
726 if (RPC_S_SERVER_UNAVAILABLE == er)
727 {
728 // MSDN says, if we get the above error code, try again with the "DS_FORCE_REDISCOVERY" flag
729 er = ::DsGetDcNameW(NULL, (LPCWSTR)pwzDomain, NULL, NULL, DS_FORCE_REDISCOVERY, &pDomainControllerInfo);
730 }
731
732 if (ERROR_SUCCESS == er && pDomainControllerInfo->DomainControllerName)
733 {
734 // Skip the \\ prefix if present.
735 if ('\\' == *pDomainControllerInfo->DomainControllerName && '\\' == *pDomainControllerInfo->DomainControllerName + 1)
736 {
737 *ppwzServerName = pDomainControllerInfo->DomainControllerName + 2;
738 }
739 else
740 {
741 *ppwzServerName = pDomainControllerInfo->DomainControllerName;
742 }
743 }
744 else
745 {
746 *ppwzServerName = pwzDomain;
747 }
748 }
749
750 if (pDomainControllerInfo)
751 {
752 ::NetApiBufferFree((LPVOID)pDomainControllerInfo);
753 }
754}
755
756/******************************************************************** 696/********************************************************************
757 CreateUser - CUSTOM ACTION ENTRY POINT for creating users 697 CreateUser - CUSTOM ACTION ENTRY POINT for creating users
758 698
@@ -776,6 +716,7 @@ extern "C" UINT __stdcall CreateUser(
776 LPWSTR pwzPassword = NULL; 716 LPWSTR pwzPassword = NULL;
777 LPWSTR pwzGroup = NULL; 717 LPWSTR pwzGroup = NULL;
778 LPWSTR pwzGroupDomain = NULL; 718 LPWSTR pwzGroupDomain = NULL;
719 LPWSTR pwzDomainName = NULL;
779 int iAttributes = 0; 720 int iAttributes = 0;
780 BOOL fInitializedCom = FALSE; 721 BOOL fInitializedCom = FALSE;
781 722
@@ -786,7 +727,6 @@ extern "C" UINT __stdcall CreateUser(
786 USER_INFO_1 userInfo1; 727 USER_INFO_1 userInfo1;
787 USER_INFO_1* pUserInfo1 = NULL; 728 USER_INFO_1* pUserInfo1 = NULL;
788 DWORD dw; 729 DWORD dw;
789 LPWSTR pwzServerName = NULL;
790 730
791 hr = WcaInitialize(hInstall, "CreateUser"); 731 hr = WcaInitialize(hInstall, "CreateUser");
792 ExitOnFailure(hr, "failed to initialize"); 732 ExitOnFailure(hr, "failed to initialize");
@@ -845,9 +785,10 @@ extern "C" UINT __stdcall CreateUser(
845 // 785 //
846 // Create the User 786 // Create the User
847 // 787 //
848 GetServerName(pwzDomain, &pwzServerName); 788 hr = GetDomainFromServerName(&pwzDomainName, pwzDomain, 0);
789 ExitOnFailure(hr, "Failed to get domain from server name: %ls", pwzDomain);
849 790
850 er = ::NetUserAdd(pwzServerName, 1, reinterpret_cast<LPBYTE>(pUserInfo1), &dw); 791 er = ::NetUserAdd(pwzDomainName, 1, reinterpret_cast<LPBYTE>(pUserInfo1), &dw);
851 if (NERR_UserExists == er) 792 if (NERR_UserExists == er)
852 { 793 {
853 if (SCAU_FAIL_IF_EXISTS & iAttributes) 794 if (SCAU_FAIL_IF_EXISTS & iAttributes)
@@ -862,7 +803,7 @@ extern "C" UINT __stdcall CreateUser(
862 if (SCAU_UPDATE_IF_EXISTS & iAttributes) 803 if (SCAU_UPDATE_IF_EXISTS & iAttributes)
863 { 804 {
864 pUserInfo1 = NULL; 805 pUserInfo1 = NULL;
865 er = ::NetUserGetInfo(pwzServerName, pwzName, 1, reinterpret_cast<LPBYTE*>(&pUserInfo1)); 806 er = ::NetUserGetInfo(pwzDomainName, pwzName, 1, reinterpret_cast<LPBYTE*>(&pUserInfo1));
866 if (ERROR_SUCCESS == er) 807 if (ERROR_SUCCESS == er)
867 { 808 {
868 // There is no rollback scheduled if the key is empty. 809 // There is no rollback scheduled if the key is empty.
@@ -922,28 +863,28 @@ extern "C" UINT __stdcall CreateUser(
922 863
923 if (ERROR_SUCCESS == er) 864 if (ERROR_SUCCESS == er)
924 { 865 {
925 hr = SetUserPassword(pwzServerName, pwzName, pwzPassword); 866 hr = SetUserPassword(pwzDomainName, pwzName, pwzPassword);
926 if (FAILED(hr)) 867 if (FAILED(hr))
927 { 868 {
928 WcaLogError(hr, "failed to set user password for user %ls\\%ls, continuing anyway.", pwzServerName, pwzName); 869 WcaLogError(hr, "failed to set user password for user %ls\\%ls, continuing anyway.", pwzDomainName, pwzName);
929 hr = S_OK; 870 hr = S_OK;
930 } 871 }
931 872
932 if (SCAU_REMOVE_COMMENT & iAttributes) 873 if (SCAU_REMOVE_COMMENT & iAttributes)
933 { 874 {
934 hr = SetUserComment(pwzServerName, pwzName, L""); 875 hr = SetUserComment(pwzDomainName, pwzName, L"");
935 if (FAILED(hr)) 876 if (FAILED(hr))
936 { 877 {
937 WcaLogError(hr, "failed to clear user comment for user %ls\\%ls, continuing anyway.", pwzServerName, pwzName); 878 WcaLogError(hr, "failed to clear user comment for user %ls\\%ls, continuing anyway.", pwzDomainName, pwzName);
938 hr = S_OK; 879 hr = S_OK;
939 } 880 }
940 } 881 }
941 else if (pwzComment && *pwzComment) 882 else if (pwzComment && *pwzComment)
942 { 883 {
943 hr = SetUserComment(pwzServerName, pwzName, pwzComment); 884 hr = SetUserComment(pwzDomainName, pwzName, pwzComment);
944 if (FAILED(hr)) 885 if (FAILED(hr))
945 { 886 {
946 WcaLogError(hr, "failed to set user comment to %ls for user %ls\\%ls, continuing anyway.", pwzComment, pwzServerName, pwzName); 887 WcaLogError(hr, "failed to set user comment to %ls for user %ls\\%ls, continuing anyway.", pwzComment, pwzDomainName, pwzName);
947 hr = S_OK; 888 hr = S_OK;
948 } 889 }
949 } 890 }
@@ -952,10 +893,10 @@ extern "C" UINT __stdcall CreateUser(
952 893
953 ApplyAttributes(iAttributes, &flags); 894 ApplyAttributes(iAttributes, &flags);
954 895
955 hr = SetUserFlags(pwzServerName, pwzName, flags); 896 hr = SetUserFlags(pwzDomainName, pwzName, flags);
956 if (FAILED(hr)) 897 if (FAILED(hr))
957 { 898 {
958 WcaLogError(hr, "failed to set user flags for user %ls\\%ls, continuing anyway.", pwzServerName, pwzName); 899 WcaLogError(hr, "failed to set user flags for user %ls\\%ls, continuing anyway.", pwzDomainName, pwzName);
959 hr = S_OK; 900 hr = S_OK;
960 } 901 }
961 } 902 }
@@ -1018,6 +959,7 @@ LExit:
1018 ReleaseStr(pwzPassword); 959 ReleaseStr(pwzPassword);
1019 ReleaseStr(pwzGroup); 960 ReleaseStr(pwzGroup);
1020 ReleaseStr(pwzGroupDomain); 961 ReleaseStr(pwzGroupDomain);
962 ReleaseStr(pwzDomainName)
1021 963
1022 if (fInitializedCom) 964 if (fInitializedCom)
1023 { 965 {