提升c#脚本的权限

本文关键字:权限 脚本 提升 | 更新日期: 2023-09-27 18:06:37

假设我想用下面的脚本更改注册表项。

RegistryKey myKey = Registry.LocalMachine.OpenSubKey("SOFTWARE''Company''SomeFolder", true);
if(myKey != null)
{
   myKey.SetValue("NameXYZ", "1", RegistryValueKind.String);
   myKey.Close();
}

因为我没有特权,所以值没有改变。改变注册表项值的一种方法是使用admin权限运行VS,然后运行脚本。但是有没有一种方法可以为任何c#脚本(.csx)设置提升的特权,然后用正常的特权从例如VS中执行这个脚本?

提升c#脚本的权限

要从Windows操作系统请求升级,你必须在你的应用程序中包含一个清单:

<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
        <!-- Leave the desired execution level here -->    
        <requestedExecutionLevel level="asInvoker" uiAccess="false" />
        <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
        <requestedExecutionLevel level="highestAvailable" uiAccess="false">
      </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>

执行级别定义如下(此处取自MSDN):

  • asInvoker:应用程序将以与启动它的进程相同的权限运行。选择以管理员身份运行,可以将应用程序提升到更高的权限级别。

  • highestAvailable:应用程序将以最高权限级别运行。如果启动应用程序的用户是Administrators组的成员,则此选项与requireadadministrator相同。如果可用的最高权限级别高于打开进程的级别,系统将提示输入凭据。

  • requireAdministrator:应用程序将以管理员权限运行。启动应用程序的用户必须是Administrators组的成员。如果打开进程没有使用管理权限运行,系统将提示输入凭据。

结论

要向注册表写入值,您可能应该在清单中包含<requestedExecutionLevel level="requireAdministrator" />。但也许你甚至不应该给HKEY_LOCAL_MACHINE写信,而应该给HKEY_CURRENT_USER写信(请参考这个答案)。

您可以查看System.Security.Permissions作为一个属性(下面显示的示例用于文件访问)

 [PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
    public void load_From_Compressed_File()
    {
    }

System.Security.Permissions上的MSDN您可能想要检查registrypermissionattribute:

https://msdn.microsoft.com/en-us/library/system.security.permissions.registrypermissionattribute (v = vs.110) . aspx