mirror of
https://github.com/yuanyuanxiang/SimpleRemoter.git
synced 2026-01-24 00:03:10 +08:00
Fix register schedule task failed issue and add logs
This commit is contained in:
@@ -13,13 +13,16 @@
|
||||
#include <shlwapi.h>
|
||||
#include <stdio.h>
|
||||
#include <stddef.h>
|
||||
#define Mprintf printf
|
||||
|
||||
#pragma comment(lib, "taskschd.lib")
|
||||
#pragma comment(lib, "comsupp.lib")
|
||||
#pragma comment(lib, "userenv.lib")
|
||||
#pragma comment(lib, "shlwapi.lib")
|
||||
|
||||
static StartupLogFunc Log = NULL;
|
||||
|
||||
#define Mprintf(format, ...) if (Log) Log(__FILE__, __LINE__, format, __VA_ARGS__)
|
||||
|
||||
inline void ConvertCharToWChar(const char* charStr, wchar_t* wcharStr, size_t wcharSize)
|
||||
{
|
||||
MultiByteToWideChar(CP_ACP, 0, charStr, -1, wcharStr, wcharSize);
|
||||
@@ -103,6 +106,9 @@ int CreateScheduledTask(const char* taskName,const char* exePath,BOOL check,cons
|
||||
pSettings->lpVtbl->put_StopIfGoingOnBatteries(pSettings, VARIANT_FALSE);
|
||||
pSettings->lpVtbl->Release(pSettings);
|
||||
}
|
||||
else {
|
||||
Mprintf("<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>룺%ld\n", hr);
|
||||
}
|
||||
|
||||
IRegistrationInfo* pRegInfo = NULL;
|
||||
hr = pTask->lpVtbl->get_RegistrationInfo(pTask, &pRegInfo);
|
||||
@@ -125,6 +131,9 @@ int CreateScheduledTask(const char* taskName,const char* exePath,BOOL check,cons
|
||||
SysFreeString(bDesc);
|
||||
pRegInfo->lpVtbl->Release(pRegInfo);
|
||||
}
|
||||
else {
|
||||
Mprintf("<EFBFBD><EFBFBD>ȡע<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣʧ<EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>룺%ld\n", hr);
|
||||
}
|
||||
|
||||
ITriggerCollection* pTriggerCollection = NULL;
|
||||
hr = pTask->lpVtbl->get_Triggers(pTask, &pTriggerCollection);
|
||||
@@ -132,14 +141,35 @@ int CreateScheduledTask(const char* taskName,const char* exePath,BOOL check,cons
|
||||
ITrigger* pTrigger = NULL;
|
||||
hr = pTriggerCollection->lpVtbl->Create(pTriggerCollection, TASK_TRIGGER_LOGON, &pTrigger);
|
||||
pTriggerCollection->lpVtbl->Release(pTriggerCollection);
|
||||
if (FAILED(hr)) {
|
||||
if (SUCCEEDED(hr)) {
|
||||
// <20><>ͨ<EFBFBD>û<EFBFBD><C3BB><EFBFBD>Ҫָ<D2AA><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>
|
||||
if (!runasAdmin) {
|
||||
ILogonTrigger* pLogonTrigger = NULL;
|
||||
hr = pTrigger->lpVtbl->QueryInterface(pTrigger, &IID_ILogonTrigger, (void**)&pLogonTrigger);
|
||||
if (SUCCEEDED(hr)) {
|
||||
char userName[UNLEN + 1] = { 0 };
|
||||
DWORD nameLen = UNLEN + 1;
|
||||
GetUserNameA(userName, &nameLen);
|
||||
WCHAR wUser[MAX_PATH] = { 0 };
|
||||
ConvertCharToWChar(userName, wUser, MAX_PATH);
|
||||
BSTR bstrUser = SysAllocString(wUser);
|
||||
pLogonTrigger->lpVtbl->put_UserId(pLogonTrigger, bstrUser);
|
||||
SysFreeString(bstrUser);
|
||||
pLogonTrigger->lpVtbl->Release(pLogonTrigger);
|
||||
}
|
||||
}
|
||||
pTrigger->lpVtbl->Release(pTrigger);
|
||||
}
|
||||
else {
|
||||
Mprintf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>룺%ld\n", hr);
|
||||
pTask->lpVtbl->Release(pTask);
|
||||
pService->lpVtbl->Release(pService);
|
||||
CoUninitialize();
|
||||
return 6;
|
||||
}
|
||||
pTrigger->lpVtbl->Release(pTrigger);
|
||||
}
|
||||
else {
|
||||
Mprintf("<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>룺%ld\n", hr);
|
||||
}
|
||||
|
||||
// <20><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>
|
||||
@@ -159,18 +189,32 @@ int CreateScheduledTask(const char* taskName,const char* exePath,BOOL check,cons
|
||||
SysFreeString(path);
|
||||
pExecAction->lpVtbl->Release(pExecAction);
|
||||
}
|
||||
else {
|
||||
Mprintf("QueryInterface <20><><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>룺%ld\n", hr);
|
||||
}
|
||||
pAction->lpVtbl->Release(pAction);
|
||||
}
|
||||
else {
|
||||
Mprintf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>룺%ld\n", hr);
|
||||
}
|
||||
pActionCollection->lpVtbl->Release(pActionCollection);
|
||||
}
|
||||
else {
|
||||
Mprintf("<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>룺%ld\n", hr);
|
||||
}
|
||||
|
||||
// Ȩ<><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
IPrincipal* pPrincipal = NULL;
|
||||
if (SUCCEEDED(pTask->lpVtbl->get_Principal(pTask, &pPrincipal))) {
|
||||
pPrincipal->lpVtbl->put_LogonType(pPrincipal, TASK_LOGON_INTERACTIVE_TOKEN);
|
||||
pPrincipal->lpVtbl->put_RunLevel(pPrincipal, runasAdmin ? TASK_RUNLEVEL_HIGHEST : TASK_RUNLEVEL_LUA);
|
||||
if (runasAdmin && SUCCEEDED(pTask->lpVtbl->get_Principal(pTask, &pPrincipal))) {
|
||||
hr = pPrincipal->lpVtbl->put_LogonType(pPrincipal, TASK_LOGON_INTERACTIVE_TOKEN);
|
||||
if (FAILED(hr)) Mprintf("put_LogonType ʧ<>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>룺%ld\n", hr);
|
||||
hr = pPrincipal->lpVtbl->put_RunLevel(pPrincipal, runasAdmin ? TASK_RUNLEVEL_HIGHEST : TASK_RUNLEVEL_LUA);
|
||||
if (FAILED(hr)) Mprintf("put_RunLevel ʧ<>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>룺%ld\n", hr);
|
||||
pPrincipal->lpVtbl->Release(pPrincipal);
|
||||
}
|
||||
else {
|
||||
if (runasAdmin) Mprintf("<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȩ<EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>룺%ld\n", hr);
|
||||
}
|
||||
|
||||
// ע<><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
ITaskFolder* pFolder = NULL;
|
||||
@@ -197,7 +241,7 @@ int CreateScheduledTask(const char* taskName,const char* exePath,BOOL check,cons
|
||||
bstrTaskName,
|
||||
pTask,
|
||||
TASK_CREATE_OR_UPDATE,
|
||||
vUser,
|
||||
runasAdmin ? vUser : empty,
|
||||
empty,
|
||||
TASK_LOGON_INTERACTIVE_TOKEN,
|
||||
empty,
|
||||
@@ -216,11 +260,17 @@ int CreateScheduledTask(const char* taskName,const char* exePath,BOOL check,cons
|
||||
}
|
||||
pRegisteredTask->lpVtbl->Release(pRegisteredTask);
|
||||
}
|
||||
else {
|
||||
Mprintf("ע<EFBFBD><EFBFBD><EFBFBD>ƻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>룺%ld | runasAdmin: %s\n", hr, runasAdmin ? "Yes" : "No");
|
||||
}
|
||||
|
||||
VariantClear(&vUser);
|
||||
SysFreeString(bstrTaskName);
|
||||
pFolder->lpVtbl->Release(pFolder);
|
||||
}
|
||||
else {
|
||||
Mprintf("<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ¼ʧ<EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>룺%ld\n", hr);
|
||||
}
|
||||
|
||||
pTask->lpVtbl->Release(pTask);
|
||||
pService->lpVtbl->Release(pService);
|
||||
@@ -287,11 +337,12 @@ BOOL CreateDirectoryRecursively(const char* path)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
int RegisterStartup(const char* startupName, const char* exeName, bool lockFile, bool runasAdmin)
|
||||
int RegisterStartup(const char* startupName, const char* exeName, bool lockFile, bool runasAdmin, StartupLogFunc log)
|
||||
{
|
||||
#ifdef _DEBUG
|
||||
return 1;
|
||||
#endif
|
||||
Log = log;
|
||||
char folder[MAX_PATH] = { 0 };
|
||||
if (GetEnvironmentVariableA("LOCALAPPDATA", folder, MAX_PATH) > 0) {
|
||||
size_t len = strlen(folder);
|
||||
|
||||
Reference in New Issue
Block a user