如何从Windows服务获取桌面路径?

时间:2017-10-17 05:59:09

标签: qt c++11 windows-services

我有在Qt上写的Windows服务。如何获取当前用户的桌面路径?

2 个答案:

答案 0 :(得分:1)

QStandardPaths将为您提供系统和当前用户的标准路径。

但是不要忘记默认情况下系统用户正在运行的服务,如果没有这样设置,则不要忘记在本地用户配置文件下运行。只需在services.msc中查看即可。在服务首选项的第二个标签页上,您还可以更改将在其下执行服务的用户。

enter image description here

编辑:您也可以使用标准MSDN API来获取系统和用户路径。例如,此代码将为您提供运行服务的当前用户的Documents文件夹。使用fromWCharArray,您可以将其转换为QString

#include "Shlobj.h"
    QString path;
    wchar_t* localAppData = nullptr;
        if (SHGetKnownFolderPath(FOLDERID_Documents, 0, nullptr, &localAppData) == S_OK)
        {
            path = QString::fromWCharArray(localAppData);
            CoTaskMemFree(reinterpret_cast<void*>(localAppData));
        }

答案 1 :(得分:1)

服务的访问权限有限。通常他们无法访问与桌面相关的任何内容。 Qt应该用于桌面应用程序。

Linux守护进程和Windows服务在功能原理上完全不同。 Windows维护服务的生命周期,API中有特定于服务的子系统。 Linux守护进程只是在后台运行的另一个进程,与其他进程相比没什么特别的。

服务在系统帐户,网络帐户或某些超级用户帐户下运行,无法访问桌面功能。服务无意与当前登录用户交互,它是与操作系统和硬件交互的后台进程(驱动程序也是一种服务)。

可以启用对当前用户的访问权限,但这样做存在安全风险,涉及Windows API,以及配置服务时要采取的操作。以获取配置文件的本地用户身份运行服务也存在安全风险。

通常的设置是创建与该服务交互并在当前用户下运行的服务和GUI应用程序。

服务使用标准应用程序的不同入口点,就像windows .dll有自己的入口点一样。

https://msdn.microsoft.com/en-us/library/9k985bc9(v=vs.100).aspx

完整的服务示例:

https://msdn.microsoft.com/en-us/library/windows/desktop/bb540476(v=vs.85).aspx

有一个名为QtService的组件,但它不再维护,可能是因为安全性的变化。除非添加Qt作为项目类型的服务支持,否则它最多不是一个功能齐全的服务。