diff options
Diffstat (limited to '')
-rw-r--r-- | src/ext/Util/ca/scaexec.cpp | 100 |
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 | ||
709 | LExit: | 688 | LExit: |
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 | ||
718 | static 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 | { |