更改所有管理员壁纸

时间:2011-12-06 12:18:21

标签: c# windows registry

我想将所有管理员的壁纸更改为我定义的壁纸(更改注册表值足以满足我的目的)。

我的想法是获取所有个人资料并搜索所有管理员:

foreach (var sid in Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList")
    .GetSubKeyNames().Select(profile => new SecurityIdentifier(profile)))
{
    if (sid.IsWellKnown(WellKnownSidType.AccountAdministratorSid)
        || sid.IsWellKnown(WellKnownSidType.BuiltinAdministratorsSid))
    {
        // Is admin
    }
}

它工作正常,只是存储在HKEY_USERS中的SID不适合我提前管理员SID。

如何从管理员处获得匹配的HKEY_USERS SID?

IE。对于管理员资料:

  • HKEY_LOCAL_MACHINE中:SID为S-1-5-21-A-B-C-500
  • HKEY_USERS中它是:S-1-5-21-A-B-C-D(其中A-B-C适合,但D来自哪里?)

感谢。

2 个答案:

答案 0 :(得分:0)

您可以通过使用LDAP查询枚举“管理员”组中的所有用户,而不是在注册表中查找用户并检查他们是否在“管理员”中。

using (DirectoryEntry groupEntry = new DirectoryEntry("WinNT://./Administrators,group"))
{
  foreach (object member in (IEnumerable)groupEntry.Invoke("Members"))
  {
    using (DirectoryEntry memberEntry = new DirectoryEntry(member))
    {
      Console.WriteLine(memberEntry.Path);
    }
  }
}

答案 1 :(得分:0)

我使用了以下解决方法:

string adminKey = Registry.Users.GetSubKeyNames()
                    .FirstOrDefault(key => key.StartsWith(sid.AccountDomainSid.Value) && char.IsDigit(key[key.Length - 1]));

if (adminKey != null) // ...