通过在本地配置文件下运行服务,从Windows服务获取用户appdata路径

时间:2013-06-04 15:45:07

标签: c# windows-services

我有一个Windows应用程序。因为我已经使用环境变量检索了appdata。所以它给了我以下路径

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

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

C:\ WINDOWS \ ServiceProfiles \本地服务\应用程序数据\本地

所以这个appdata路径与我从windows应用程序环境变量appdata路径获得的appdata路径不同。

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

所以我的问题是如何通过在本地配置文件下运行服务而不提示输入用户名和密码来从服务获取用户appdata路径?

2 个答案:

答案 0 :(得分:4)

我也遇到过这个问题并看了你的问题,但我乍看之下没有找到答案。

这是Mohit shah答案

“我发现通过在配置文件”LocalSystem“下运行服务,无法从Windows服务获取用户appdata路径。所以我使用了Environment.SpecialFolder.CommomAppData,它在Windows上运行时为我提供了应用程序数据路径C:\ ProgramData 7,当在Windows服务中使用相同的东西时,它也给出相同的路径,我也在配置文件“LocalSystem”下运行服务,所以它没有提示我输入凭据。所以这解决了我的问题。“

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

答案 1 :(得分: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;
}