在本地配置文件下运行服务,从Windows服务中获取用户应用程序数据路径

3

我有一个Windows应用程序,在其中使用环境变量检索appdata。所以它给我以下路径:

c:\document and settings\current user name\application data.

但是,当我从Windows服务中使用环境变量检索appdata路径时,我得到以下路径:

c:\windows\ServiceProfiles\LocalService\AppData\Local

因此,这个appdata路径与我从Windows应用程序环境变量appdata路径获得的不同。

我正在本地配置文件下运行Windows服务。我知道如果将服务配置文件更改为运行在用户下,则服务appdata路径和Windows应用程序appdata路径将匹配,但是服务会提示输入用户名和密码。

因此,我的问题是如何在本地配置文件下运行服务并获取用户appdata路径而不提示输入用户名和密码?


你确定即使你设法获取它,也能从中读取/写入吗? - Felice Pollano
是的,我确定如果我得到路径,我可以读写它。实际上,从Windows应用程序中,我正在创建自己的文件夹在用户appdata下。现在从Windows服务中,我需要在不在用户配置文件下运行服务的情况下从或向已创建的文件夹读写数据。因为如果在用户配置文件下运行,我会得到精确的appdata路径,但它会提示输入用户名和密码,这是我想避免的。如果在本地配置文件下运行,则不会提示凭据,但appdata路径不同。 - Mohit Shah
我解决了这个问题。经过大量的谷歌和研究,我发现在使用“LocalSystem”配置文件运行服务时,无法从Windows服务中获取用户应用程序数据路径。因此,我使用了Environment.SpecialFolder.CommomAppData 当在Windows 7上运行并在Windows服务中使用相同的内容时,它会给我提供应用程序数据路径C:\ ProgramData,并且我也在“LocalSystem”配置文件下运行服务,所以它没有提示我输入凭据。这样就解决了我的问题。 - Mohit Shah
你应该创建一个回答帖子来回答自己的问题,然后接受它,而不是写评论。这有助于其他人看到问题已经解决,并轻松地找到解决方案。 - user1651105
2个回答

5

我也遇到了这个问题,看到你的问题后,但是一开始我没有在其中找到答案。

以下是Mohit Shah的答案:

"我发现在以"LocalSystem"的身份运行服务时,无法从Windows服务中获取用户应用数据路径。 因此,我使用了Environment.SpecialFolder.CommomAppData,当在Windows 7上运行并在Windows服务中使用相同的方法时,它也给出了相同的路径,而且我还以“LocalSystem”的身份运行服务,因此它没有提示我输入凭据。 所以这解决了我的问题。"

@Mohit Shah,请将其标记为答案,以便其他人可以从中获得帮助。


0

Windows服务将始终在SYSTEM级别运行,因此它无法访问特定于用户的文件夹。如@ovais建议的那样,您可以将用户数据存储在程序数据文件夹内,或者您可以使用以下方法。

您可以使用Windows管理API获取当前Windows用户名。通常剩余路径将保持不变,因此您可以构造剩余路径。

例如,数据存储在“C:\Users\xyzUser\appdata\roaming...”中

这里唯一不固定的是“xyzUser”和“C”(用户可以安装在不同的驱动器中)。

public static string GetWindowsUserAccountName()
{
string userName = string.Empty;
ManagementScope ms = new ManagementScope("\\\\.\\root\\cimv2");
ObjectQuery query = new ObjectQuery("select * from win32_computersystem");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(ms, query);

foreach (ManagementObject mo in searcher?.Get())
{
userName = mo["username"]?.ToString();
}
userName = userName?.Substring(userName.IndexOf(@"\") + 1);

return userName;
}

这种方法的缺点是,当您通过远程连接时,用户名将会显示为“NULL”。因此,请在使用时小心。

您可以通过以下代码段获取Windows文件夹。

public static string GetWindowsFolder()
{
string windowsFolder = string.Empty;
ManagementScope ms = new ManagementScope("\\\\.\\root\\cimv2");
ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_OperatingSystem");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(ms, query);
foreach (ManagementObject m in searcher?.Get())
{
windowsFolder = m["WindowsDirectory"]?.ToString();
}
windowsFolder = windowsFolder.Substring(0, windowsFolder.IndexOf(@"\"));
return windowsFolder;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接