diff options
Diffstat (limited to 'src/ext/Util/ca/scaexec.cpp')
| -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 | { |
