Я пытаюсь вызвать Advapi32.LsaOpenPolicy() из базового кода MSI InstallShield. Я успешно вызвал другие методы avdapi32.dll; Но LsaOPenPolicy выбрасывает ошибку несоответствующего типа.InstallShield вызов метода ошибки метода advapi32.dll
Мой прототип:
prototype INT Advapi32.LsaOpenPolicy(POINTER, POINTER, INT, POINTER);
Определение окон:
NTSTATUS LsaOpenPolicy(
_In_ PLSA_UNICODE_STRING SystemName,
_In_ PLSA_OBJECT_ATTRIBUTES ObjectAttributes,
_In_ ACCESS_MASK DesiredAccess,
_Inout_ PLSA_HANDLE PolicyHandle
);
Я отметил в образцах C++, что структура ObjectAttriibute обнуляется. Поэтому я делаю что-то подобное здесь в коде InstallShield - pArray указывает на содержимое массива.
for i = 0 to 11
array(i) = 0;
endfor;
array(0) = 24;
// current error is 80020005 type mismatch.
try
i = POLICY_CREATE_ACCOUNT | POLICY_LOOKUP_NAMES;
pArray = array;
pPolicy = NULL;
nvOSResult = LsaOpenPolicy(NULL, pArray, i, pPolicy);
catch
Sprintf(errString, "0x%08x", Err.Number);
_Logger(hMSI, methodName, "LsaOpenPolicy Exception "+errString, INFORMATION, FALSE);
nvOSResult = Err.Number;
endcatch;
Нет другой информации, которую я могу найти, кроме ошибки 80020005; Я пробовал несколько различных конструкций аргументов, но я не могу пройти мимо этого.
Я разместил это на форуме flexera и microsoft, но у меня там не было никакой тяги. (ссылки для потомков: flexera-link, microsoft-link)
Любая помощь или предложения приветствуются!
Прошу прощения, 10 лет назад я бы все это пережил, но в эти дни я не вижу смысла вкладывать это усилие в InstallScript. Я бы сделал это как пользовательское действие C++ или пользовательское действие C#. Если вы пытаетесь сделать то, что, как я думаю, вы пытаетесь сделать (большой вход в систему как услуга для учетной записи), есть гораздо более простые способы сделать это в встроенном в WiX модуле слияния, который затем потребляется InstallShield. –
Пользовательское действие с использованием C++ звучит как интересное предложение. Я не знаком с WiX. – user2097370
Чтобы закончить цикл, я поместил все в C++ DLL (со статической привязкой), поскольку я столкнулся с несоответствием времени выполнения, но это уже другая история). Я похоронил DLL как двоичные данные в двоичной таблице. – user2097370