【问题标题】:Elevating privilege for C# scripts提升 C# 脚本的权限
【发布时间】:2016-09-11 15:46:20
【问题描述】:

假设我想使用以下脚本更改注册表项。

RegistryKey myKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Company\\SomeFolder", true);

if(myKey != null)
{
   myKey.SetValue("NameXYZ", "1", RegistryValueKind.String);
   myKey.Close();
}

值没有改变,因为我没有权限。 如何更改注册表项值的一种方法是例如以管理员权限运行 VS,然后运行脚本。 但是有没有办法为任何 C# 脚本(.csx)设置提升的特权,然后从例如执行这个脚本。 VS 普通权限?

【问题讨论】:

  • 不,不是。取决于你如何执行脚本。如果您从 C# 交互窗口执行此操作,则必须运行 VS 提升。如果您使用 csi.exe 执行此操作,那么您必须运行一个程序,该程序通过其清单或 runas 请求提升并让它启动 csi.exe。

标签: c# uac csx


【解决方案1】:

要从 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 here):

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

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

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

结论

要将值写入注册表,您可能应该在清单中包含&lt;requestedExecutionLevel level="requireAdministrator" /&gt;。 但也许你甚至不应该写信给HKEY_LOCAL_MACHINE,而是HKEY_CURRENT_USER(请参考this answer)。

【讨论】:

    【解决方案2】:

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

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

    MSDN on System.Security.Permissions你会想专门检查一下registrypermission属性:

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

    【讨论】:

      猜你喜欢
      • 2021-06-22
      • 2012-03-27
      • 2010-12-08
      • 2018-04-21
      • 1970-01-01
      • 2011-02-25
      • 2013-11-09
      • 1970-01-01
      相关资源
      最近更新 更多