【问题标题】:Get desktop path for all administrators in C#在 C# 中获取所有管理员的桌面路径
【发布时间】:2012-01-19 09:23:59
【问题描述】:

我需要为系统中的所有管理员创建我的应用程序的桌面快捷方式。 我正在使用以下代码获取用户列表。

        var identifier = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null);
        GroupPrincipal group = GroupPrincipal.FindByIdentity(new PrincipalContext(ContextType.Machine), identifier.Value);

        foreach (Principal principal in group.Members)
        {
            Console.WriteLine(principal.Name);
        }

我需要以某种方式为每个用户获取桌面路径。你能建议我解决方案吗?非常感谢。

【问题讨论】:

  • 是否需要提前迭代机器上的所有用户,还是可以在用户登录时动态创建快捷方式?
  • 如果在安装应用后将某人添加到管理员组会怎样?他们的快捷方式是什么时候创建的?相反,我会向公共桌面文件夹添加一个快捷方式(以便所有用户都能看到),但使用清单需要管理权限才能运行它(假设是 Vista 或更高版本)。
  • 不是动态的,只是迭代和创建快捷方式。

标签: c# shortcuts


【解决方案1】:

您需要调用 SHGetFolderLocation 函数 (http://msdn.microsoft.com/en-us/library/bb762180.aspx),该函数允许您传入代表您感兴趣的用户的访问令牌在。

不知道这会有多困难。

【讨论】:

  • 我只是在谷歌上搜索这个函数并试图找到如何获取用户令牌。
  • 我知道在没有密码或现有模拟上下文的情况下获取用户令牌的唯一方法是调用 LsaLogonUser 函数。出于充分的理由,您必须为此拥有 SeTcbPrivilege (“作为操作系统的一部分”),默认情况下这意味着作为 LocalSystem 运行(在决定走这条路之前要仔细考虑)。请注意,SHGetKnownFolderPath 及其老表亲还指定必须加载用户的注册表配置单元,这意味着调用 LoadUserProfile,这是另一个需要令牌的操作。我真的会使用公共快捷方式和管理员清单。
【解决方案2】:

您可以使用几个选项,具体取决于您想要如何操作。

选项A:

硬编码,但适用于默认系统设置

var userDirectory = Path.Combine("C:\Users\", principal.Name, "\Desktop");

选项 B:

查找当前用户,然后将其换出

var currentUser = Environment.GetFolderPath(Environment.SpecialFolder.Desktop));
var newUser = currentUser.Replace("MyUser", principal.Name);

现在,选项 B 尚未经过全面测试,但应该可以工作!

【讨论】:

  • 这仅适用于默认桌面位置,但我可以将桌面路径更改为 D:\MyDesktop 例如。
  • 不明白为什么需要第二行选项 B?
  • 选项 B 不适用于已移动其特殊文件夹的用户。我已经将我的所有内容都移到了一个非系统卷上,因为这是我大部分可用空间所在的位置。
  • 选项 B 的第 2 行是必需的,因为桌面路径是针对当前用户的,因此要枚举其他需要替换的用户。
猜你喜欢
  • 1970-01-01
  • 2018-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-09
  • 2010-10-12
相关资源
最近更新 更多