【问题标题】:How to get all users application data folders under system account?如何获取系统帐户下的所有用户应用程序数据文件夹?
【发布时间】:2015-04-02 15:54:51
【问题描述】:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) 返回当前用户文件夹,但在系统帐户下返回例如:

C:\Windows\system32\config\systemprofile\AppData\Roaming\

那么问题来了,如何通过系统账号获取所有用户的AppData文件夹呢?

【问题讨论】:

  • 说明你想做什么,而不是你认为应该怎么做。
  • 我想获取所有用户的所有 appData 文件夹路径
  • 是的,从你的问题中可以清楚地看出你想要那个。这是一个奇怪的问题,这就是为什么我问你为什么要这样做
  • 你为什么需要这样做?
  • 我们正试图让您详细说明您在获得这些信息后打算做什么。据推测,您的代码的全部目的不仅仅是设置一个字符串等于特定文件夹路径然后退出?

标签: c#


【解决方案1】:

我想,这对你有帮助:

//List all the users
List<String> usersList = new List<String>();
ManagementObjectSearcher sidQuery = new ManagementObjectSearcher("SELECT * FROM Win32_Account");
ManagementObjectCollection results = sidQuery.Get();
foreach (ManagementObject result in results)
{
   usersList.Add(result["Name"])
}

//Showing all the partitions letters 
String[] strDrives = Environment.GetLogicalDrives();
Foreach (string strDrive in strDrives)
{
  //Check if profil has AppData folder
  List<String> usersAppData = new List<String>();
  String pathAppData = String.Empty;
  foreach(String user in usersList)
  {
     pathAppData = String.Format("{0}\Users\{1}\AppData", strDrive, user);
     if(Directory.Exists(pathAppData ))
     {
        usersAppData.Add(pathAppData);
     }
  }
}

    //Here, you've got all the users AppData folder in usersAppData

【讨论】:

  • Environment.SystemDrive 不工作,文件夹可以移动到任何驱动器
  • "SystemRoot" 也不起作用,它只是 windows 不是用户的文件夹
  • 是的,这会起作用,但它会变慢,尤其是在网络驱动器的情况下
  • 我修改了代码。代码列出每个分区,并检查所有分区。 “SystemRoot”是一个错误:Environment.GetEnvironmentVariable("SystemRoot")
【解决方案2】:

当我想获取“SYSTEM”帐户下的用户特殊文件夹(Desktop 或 MyDocuments)的路径时,我遇到了同样的问题。经过长时间的调查,我找到了解决方案:

string sid = string.Empty; 
using (var mos = new ManagementObjectSearcher(
                        "Select SID From Win32_UserAccount where Disabled = 0"))
{
    foreach (var bios in mos.Get())
    {
        sid = bios["SID"].ToString();
    }
}
using (RegistryKey key = Registry.Users.OpenSubKey(sid +
@"\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"))
{
    var docFolder = key.GetValue("Personal");
    var desktopFolder = key.GetValue("Desktop");
    Console.WriteLine("document folder: {0}", docFolder);
    Console.WriteLine("Desktop folder: {0}", desktopFolder);
}

"Disabled = 0" 是获取活跃用户的选项。如果您使用“regedit”打开您的注册表,您将找到所需的一切。

【讨论】:

  • 嗨,您从哪里访问此方法 ManagementObjectSearcher() ?你在访问像 win32 这样的库吗?
猜你喜欢
  • 2011-10-04
  • 2011-11-12
  • 1970-01-01
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
  • 2013-04-07
  • 2010-11-01
  • 1970-01-01
相关资源
最近更新 更多