假设我想使用以下脚本更改注册表项。
RegistryKey myKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Company\\SomeFolder", true);
if(myKey != null)
{
myKey.SetValue("NameXYZ", "1", RegistryValueKind.String);
myKey.Close();
}
由于我没有权限,因此不会更改该值。 改变注册表键值的一种方法是例如使用管理员权限运行VS,然后运行脚本。 但有没有办法如何为任何C#脚本(.csx)设置提升的特权,然后从例如执行此脚本VS具有正常权限?
答案 0 :(得分:0)
要从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 :应用程序将以管理员权限运行。启动应用程序的用户必须是Administrators组的成员。如果打开过程未以管理权限运行,系统将提示输入凭据。
要将值写入注册表,您应该在清单中包含<requestedExecutionLevel level="requireAdministrator" />
。
但也许你甚至不应该写HKEY_LOCAL_MACHINE
而是HKEY_CURRENT_USER
(请参阅this answer)。
答案 1 :(得分:-1)
您可以将System.Security.Permissions视为属性(下面显示的文件访问示例)
[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
public void load_From_Compressed_File()
{
}
MSDN on System.Security.Permissions您需要专门查看registrypermission属性: