Windows服务内调用外部GUI程序

auto call = [&](std::string app,std::string args){
                            bool result = false;
                            DWORD sessionId = WTSGetActiveConsoleSessionId();
                            if (0xFFFFFFFF == sessionId)
                            {
                                return result;
                            }

                            HANDLE userToken = nullptr;
                            if (!bool(WTSQueryUserToken(sessionId, &userToken)))
                            {
                                return result;
                            }

                            HANDLE tokenCarbon = nullptr;
                            if (bool(DuplicateTokenEx(userToken,
                                                      TOKEN_ASSIGN_PRIMARY |TOKEN_ALL_ACCESS,
                                                      nullptr,
                                                      SecurityImpersonation,
                                                      TokenPrimary,
                                                      &tokenCarbon))){
                                if (bool(ImpersonateLoggedOnUser(tokenCarbon))){
                                    DWORD creationFlags = HIGH_PRIORITY_CLASS | CREATE_NEW_CONSOLE;
                                    STARTUPINFO startusInfo{};
                                    startusInfo.cb = sizeof(startusInfo);
                                    PROCESS_INFORMATION processInfo{};
                                    SECURITY_ATTRIBUTES processSA{};
                                    processSA.nLength = sizeof(processSA);
                                    SECURITY_ATTRIBUTES threadSA{};
                                    threadSA.nLength = sizeof(threadSA);

                                    LPVOID userContext = nullptr;
                                    if (bool(CreateEnvironmentBlock(&userContext, tokenCarbon, TRUE))){
                                        creationFlags |= CREATE_UNICODE_ENVIRONMENT;
                                    }

                                    CHAR path[MAX_PATH]{};
                                    std::memcpy(path,app.c_str(),app.length());

                                    CHAR commandLine[MAX_PATH]{};
                                    std::memcpy(commandLine,args.c_str(),args.length());

                                    result =  CreateProcessAsUser(
                                                  tokenCarbon,
                                                  path,
                                                  commandLine,
                                                  &processSA,
                                                  &threadSA,
                                                  FALSE,
                                                  creationFlags,
                                                  userContext,
                                                  nullptr,
                                                  &startusInfo,&processInfo);
                                    RevertToSelf();
                                    if (userContext)
                                    {
                                        DestroyEnvironmentBlock(userContext);
                                    }
                                }
                                CloseHandle(tokenCarbon);
                            }
                            CloseHandle(userToken);
                            return result;
                        };
                        call("C:\\Apps\\360\\360zip\\360zip.exe","");
  • 此表达式实现了从Windows服务(内核态)调用外部GUI程序

转载于:https://my.oschina.net/mistylinux/blog/2878618

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值