首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Windows服务运行外部程序(pscp)不起作用

从Windows服务运行外部程序(pscp)不起作用
EN

Stack Overflow用户
提问于 2010-12-07 00:59:27
回答 4查看 1.7K关注 0票数 0

我正在用C++ (Visual Studio2010)编写一个Windows Service,这个服务必须通过安全复制(我使用pscp.exe )将文件发送到远程服务器。

因此,我使用system函数启动pscp.exe,当作为一个普通应用程序运行时,一切正常。

但是,如果我尝试作为服务运行,服务将启动pscp.exe (我可以在任务管理器上看到这一点),但是pscp.exe冻结,并且不会向远程主机发送任何内容。即使我停止了服务,我也需要自己杀死pscp进程。

我在一些论坛上读到允许该服务“与桌面交互”,但这并没有解决我的问题。

我还尝试更改服务登录所用的用户帐户,但没有结果。

有什么想法吗?

从Windows Service运行外部程序似乎非常困难,即使这个外部程序没有任何图形用户界面,如pscp.exe。

谢谢!

--奥古斯托·卡林吉

EN

回答 4

Stack Overflow用户

发布于 2010-12-07 01:12:44

您对pscp调用的选择是什么?如果有“静默”选项,请使用该选项来避免控制台交互。通常,这是-q/q

请注意,任何启动的应用程序都将在与您的服务相同的用户帐户中运行。该帐户是否有权限执行您所要求的操作?上下文(运行目录、路径)是否正确,以便pscp执行您想要的操作?

票数 0
EN

Stack Overflow用户

发布于 2010-12-07 01:33:24

您可以尝试使用impersonate。就像这样..。

代码语言:javascript
复制
    wchar_t* cmPath=readRegistryString(L"Software\\" TO_WCHAR(ORG_NAME) L"\\" TO_WCHAR(APP_NAME) L"\\" TO_WCHAR(APPLICATION_GROUP),TO_WCHAR(APPLICATION_EXEC_PATH));
if (!cmPath)
{
    return false;
}
HANDLE userToken=NULL;
DWORD sessId=WTSGetActiveConsoleSessionId ();
if((long)sessId==-1)
{
    sessId=0;
}
WTSQueryUserToken (sessId, &userToken);
bool result=false;
if(userToken/**/ )
{
    SECURITY_ATTRIBUTES sa;
    ZeroMemory(&sa,sizeof(SECURITY_ATTRIBUTES));
    sa.nLength=sizeof(SECURITY_ATTRIBUTES);
    STARTUPINFOW si;
    ZeroMemory(&si,sizeof(STARTUPINFOW));
    si.cb=sizeof(STARTUPINFOW);
    PROCESS_INFORMATION pi;
    ZeroMemory(&pi,sizeof(PROCESS_INFORMATION));
    CStringW str= L"\"";
    str=str+cmPath;
    str=str+L"\"";
    str.Replace(L"/",L"\\");

    if(CreateProcessAsUserW(userToken,NULL,str.GetBuffer(),NULL,NULL,false,NULL,NULL,NULL,&si,&pi))
    {
            result=true;
            CloseHandle(pi.hProcess);
            CloseHandle(pi.hThread);
    }
    else
    {
        DWORD err = GetLastError();
        //nop;
    }
}
if(userToken)
    CloseHandle(userToken);
delete[] cmPath;

这段代码我用来从服务调用GUI应用程序,但我认为它不需要对控制台应用程序做太多更改。

票数 0
EN

Stack Overflow用户

发布于 2010-12-07 06:41:12

您应该使用CreateProcess函数而不是系统来启动pscp应用程序。后者将您的命令转发到命令解释器(cmd.exe),该命令解释器可能无法从服务访问。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4368917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档