【问题标题】:.vbs file not working properly from windows service.vbs 文件无法从 Windows 服务正常工作
【发布时间】:2013-11-29 05:41:18
【问题描述】:

我用 C++ 创建了一个 Windows 服务,它在特定事件上运行一个 VBScript 文件。当我从 C++ 中的 Win32 应用程序执行此操作时,这工作正常,但在 Windows 服务中的工作方式不同。

CPP文件代码:

SHELLEXECUTEINFO ExecuteInfo;

memset(&ExecuteInfo, 0, sizeof(ExecuteInfo));

ExecuteInfo.cbSize       = sizeof(ExecuteInfo);
ExecuteInfo.fMask        = 0;                
ExecuteInfo.hwnd         = 0;                
ExecuteInfo.lpVerb       = _T("open");                      // Operation to perform
ExecuteInfo.lpFile       = _T("D:\\demo.vbs");  // Application name
ExecuteInfo.lpParameters = 0;           // Additional parameters
ExecuteInfo.lpDirectory  = 0;                           // Default directory
ExecuteInfo.nShow        = SW_SHOW;
ExecuteInfo.hInstApp     = 0;
if(ShellExecuteEx(&ExecuteInfo) == FALSE)
{
}

【问题讨论】:

  • 默认情况下,VBScript 使用“GUI”解释器 wscript.exe 运行。尝试使用cscript.exe 运行它。
  • “工作方式不同”究竟是什么意思?
  • @MC ND 这一行 "Set objShellWindows = objShell.Windows" 给出了当前从 exe 打开的所有窗口选项卡,但是当它从 Windows 服务调用时什么也没提供。

标签: c++ vbscript windows-services


【解决方案1】:

假设 objShell.Windows 是“Shell.Application”的一个实例,你得到的是根据msdn

ShellWindows 对象:表示打开的窗口的集合 属于壳牌。与此对象关联的方法可以控制 并在Shell内执行命令,并获取其他与Shell相关的 对象。

关键部分是that belong to the Shell。您的问题是您桌面中的外壳与您机器中的服务所具有的外壳不同。

服务在单独的会话中运行。

所以,您的脚本可以正常工作。它不会返回任何 shell 窗口,因为在运行服务的会话中没有任何人。

【讨论】:

  • 那么我该如何完成呢?我想从服务中打开用户 shell 的窗口?有什么办法吗?
  • 总之没有。你可以这样做(见here),但正确的做法是检测用户登录,并启动一个在用户会话中运行的帮助程序,并实现一种使帮助程序和服务通信的方法。 herehere 你会发现如何(对不起,C/C++/C# 代码)
【解决方案2】:

我创建了一个普通的 exe 而不是 windows 服务,并将其添加到 windows 启动注册表中。 这样我就能达到预期。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-10
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    • 2018-01-08
    • 2014-01-28
    相关资源
    最近更新 更多