Na Windows XP zdaj namestitev spet doda fiksen "naključen" časovni zamik izvajanja opravila.

Pri zakasnjenih akcijah sem moral dodati zastavico msidbCustomActionTypeNoImpersonate, sicer se je na Windows Vista namestitev razporejenih opravil ni izvedla kot SYSTEM ampak kot uporabnik, ki je pognal namestitev. In to brez dvignjenih privilegijev.

Usposobil in preizkusil sem namestitev na Windows XP, Vista in 7. Projekt je s tem uradno uspešno končan! :)))
This commit is contained in:
Simon Rozman 2013-01-09 22:24:36 +00:00
parent 6c92257d6e
commit a72f1e2c78
2 changed files with 38 additions and 4 deletions

View File

@ -115,9 +115,9 @@ Action Type Source Target
s$(MSI_TIP_ID) i2 S$(MSI_TIP_ID) S255
CustomAction Action
EvaluateScheduledTasks 1 binMSITSCA.dll EvaluateScheduledTasks
InstallScheduledTasks 1025 binMSITSCA.dll InstallScheduledTasks
RollbackScheduledTasks 1281 binMSITSCA.dll InstallScheduledTasks
CommitScheduledTasks 1537 binMSITSCA.dll InstallScheduledTasks
InstallScheduledTasks 3073 binMSITSCA.dll InstallScheduledTasks
RollbackScheduledTasks 3329 binMSITSCA.dll InstallScheduledTasks
CommitScheduledTasks 3585 binMSITSCA.dll InstallScheduledTasks
<<NOKEEP

View File

@ -524,11 +524,45 @@ HRESULT CMSITSCAOpTaskCreate::Execute(CMSITSCASession *pSession)
for (pos = m_lTriggers.GetHeadPosition(); pos;) {
WORD wTriggerIdx;
CComPtr<ITaskTrigger> pTrigger;
TASK_TRIGGER &ttData = m_lTriggers.GetNext(pos);
TASK_TRIGGER ttData = m_lTriggers.GetNext(pos); // Don't use reference! We don't want to modify original trigger data by adding random startup delay.
hr = pTask->CreateTrigger(&wTriggerIdx, &pTrigger);
if (FAILED(hr)) goto finish;
if (ttData.wRandomMinutesInterval) {
// Windows XP doesn't support random startup delay. However, we can add fixed "random" delay when creating the trigger.
WORD wStartTime = ttData.wStartHour * 60 + ttData.wStartMinute + (WORD)::MulDiv(rand(), ttData.wRandomMinutesInterval, RAND_MAX);
FILETIME ftValue;
SYSTEMTIME stValue;
ULONGLONG ullValue;
// Convert MDY date to numerical date (SYSTEMTIME -> FILETIME -> ULONGLONG).
memset(&stValue, 0, sizeof(SYSTEMTIME));
stValue.wYear = ttData.wBeginYear;
stValue.wMonth = ttData.wBeginMonth;
stValue.wDay = ttData.wBeginDay;
verify(::SystemTimeToFileTime(&stValue, &ftValue));
ullValue = ((ULONGLONG)(ftValue.dwHighDateTime) << 32) | ftValue.dwLowDateTime;
// Wrap days.
while (wStartTime >= 1440) {
ullValue += (ULONGLONG)864000000000;
wStartTime -= 1440;
}
// Convert numerical date to DMY (ULONGLONG -> FILETIME -> SYSTEMTIME).
ftValue.dwHighDateTime = ullValue >> 32;
ftValue.dwLowDateTime = ullValue & 0xffffffff;
verify(::FileTimeToSystemTime(&ftValue, &stValue));
// Set new trigger date and time.
ttData.wBeginYear = stValue.wYear;
ttData.wBeginMonth = stValue.wMonth;
ttData.wBeginDay = stValue.wDay;
ttData.wStartHour = wStartTime / 60;
ttData.wStartMinute = wStartTime % 60;
}
hr = pTrigger->SetTrigger(&ttData);
if (FAILED(hr)) goto finish;
}