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;
}