1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information.
#include "precomp.h"
LPCWSTR vcsUserQuery = L"SELECT `User`, `Component_`, `Name`, `Domain`, `Password` FROM `Wix4User` WHERE `User`=?";
enum eUserQuery { vuqUser = 1, vuqComponent, vuqName, vuqDomain, vuqPassword };
HRESULT __stdcall ScaGetUser(
__in LPCWSTR wzUser,
__out SCA_USER* pscau
)
{
if (!wzUser || !pscau)
{
return E_INVALIDARG;
}
HRESULT hr = S_OK;
PMSIHANDLE hView, hRec;
LPWSTR pwzData = NULL;
// clear struct and bail right away if no user key was passed to search for
::ZeroMemory(pscau, sizeof(*pscau));
if (!*wzUser)
{
ExitFunction1(hr = S_OK);
}
hRec = ::MsiCreateRecord(1);
hr = WcaSetRecordString(hRec, 1, wzUser);
ExitOnFailure(hr, "Failed to look up User");
hr = WcaOpenView(vcsUserQuery, &hView);
ExitOnFailure(hr, "Failed to open view on User table");
hr = WcaExecuteView(hView, hRec);
ExitOnFailure(hr, "Failed to execute view on User table");
hr = WcaFetchSingleRecord(hView, &hRec);
if (S_OK == hr)
{
hr = WcaGetRecordString(hRec, vuqUser, &pwzData);
ExitOnFailure(hr, "Failed to get Wix4User.User");
hr = ::StringCchCopyW(pscau->wzKey, countof(pscau->wzKey), pwzData);
ExitOnFailure(hr, "Failed to copy key string to user object");
hr = WcaGetRecordString(hRec, vuqComponent, &pwzData);
ExitOnFailure(hr, "Failed to get Wix4User.Component_");
hr = ::StringCchCopyW(pscau->wzComponent, countof(pscau->wzComponent), pwzData);
ExitOnFailure(hr, "Failed to copy component string to user object");
hr = WcaGetRecordFormattedString(hRec, vuqName, &pwzData);
ExitOnFailure(hr, "Failed to get Wix4User.Name");
hr = ::StringCchCopyW(pscau->wzName, countof(pscau->wzName), pwzData);
ExitOnFailure(hr, "Failed to copy name string to user object");
hr = WcaGetRecordFormattedString(hRec, vuqDomain, &pwzData);
ExitOnFailure(hr, "Failed to get Wix4User.Domain");
hr = ::StringCchCopyW(pscau->wzDomain, countof(pscau->wzDomain), pwzData);
ExitOnFailure(hr, "Failed to copy domain string to user object");
hr = WcaGetRecordFormattedString(hRec, vuqPassword, &pwzData);
ExitOnFailure(hr, "Failed to get Wix4User.Password");
hr = ::StringCchCopyW(pscau->wzPassword, countof(pscau->wzPassword), pwzData);
ExitOnFailure(hr, "Failed to copy password string to user object");
}
else if (E_NOMOREITEMS == hr)
{
WcaLog(LOGMSG_STANDARD, "Error: Cannot locate Wix4User.User='%ls'", wzUser);
hr = E_FAIL;
}
else
{
ExitOnFailure(hr, "Error or found multiple matching User rows");
}
LExit:
ReleaseStr(pwzData);
return hr;
}
|