C#中,以下问题:
1。如何判断哪个动作需要管理员权限?
比如运行时向Program Files子目录下写入文件时,怎么知道当前用户权限不够?
2。在知道当前权限不够的情况下,如果弹出UAC(用户权限控制开窗),来动态提升当前进程权限?
不是在程式运行前通过Run As等提升,而是进程已启动后,在一个操作没有权限的情况下,开启UAC开窗以获得管理员权限
1。如何判断哪个动作需要管理员权限?
比如运行时向Program Files子目录下写入文件时,怎么知道当前用户权限不够?
2。在知道当前权限不够的情况下,如果弹出UAC(用户权限控制开窗),来动态提升当前进程权限?
不是在程式运行前通过Run As等提升,而是进程已启动后,在一个操作没有权限的情况下,开启UAC开窗以获得管理员权限
动态代码控制,倒没有做过
try..catch 分析message
2
window系统说 你的要求很过分,
目前你可以在运行前或者运行后使用run as 或者某种api提升进程的权限,无法为某个操作提升权限
因此保存设定时就需要管理员权限
也不要跟我说将设定档放到ApplicationData下,因为客户不希望将一个产品的文件分在不同目录下存放,那样他觉得很乱。
<!-- UAC 清单选项
如果要更改 Windows 用户帐户控制级别,请用以下节点之一替换
requestedExecutionLevel 节点。 <requestedExecutionLevel level="asInvoker" uiAccess="false" />
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
<requestedExecutionLevel level="highestAvailable" uiAccess="false" /> 指定 requestedExecutionLevel 节点将会禁用文件和注册表虚拟化。
如果要利用文件和注册表虚拟化实现向后
兼容性,则删除 requestedExecutionLevel 节点。
-->将 <requestedExecutionLevel level="asInvoker" uiAccess="false" />设置为requireAdministrator后,保存运行。当程序需要管理员权限时,就会提示用户是否允许。
=======================
我的需求是程序运行中,而不是程式运行前就以管理员身份运行
因为我的程序绝大部分情况下只需普通用户权限,仅在保存设定时需求弹出个UAC开窗提示进程权限
#region
/// <summary>
/// 设置文件的访问权限
/// </summary>
/// <param name="filePath"> 路径</param>
/// <param name="username"> 用户名</param>
/// SetAccount(@"C:\eee.txt", "BATCH");
public static void SetAccount(string filePath, string username)
{ FileInfo fileInfo = new FileInfo(filePath); FileSecurity fileSecurity = fileInfo.GetAccessControl(); fileSecurity.AddAccessRule(new FileSystemAccessRule(username, FileSystemRights.FullControl, AccessControlType.Allow)); //以完全控制为例 fileInfo.SetAccessControl(fileSecurity); }
/// <summary>
/// 设置路径的访问权限
/// </summary>
/// <param name="FolderPath">路径</param>
/// <param name="UserName">用户名</param>
/// <param name="Rights">权限</param>
/// <param name="AllowOrDeny">可访问</param>
/// <returns></returns>
/// 调用方式SetFolderACL("C:\\test", "BATCH", FileSystemRights.FullControl, AccessControlType.Allow);
public static bool SetFolderACL(String FolderPath, String UserName, FileSystemRights Rights, AccessControlType AllowOrDeny)
{ InheritanceFlags inherits = InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit; return SetFolderACL(FolderPath, UserName, Rights, AllowOrDeny, inherits, PropagationFlags.None, AccessControlModification.Add); } public static bool SetFolderACL(String FolderPath, String UserName, FileSystemRights Rights, AccessControlType AllowOrDeny, InheritanceFlags Inherits, PropagationFlags PropagateToChildren, AccessControlModification AddResetOrRemove)
{ bool ret; DirectoryInfo folder = new DirectoryInfo(FolderPath); DirectorySecurity dSecurity = folder.GetAccessControl(AccessControlSections.All); FileSystemAccessRule accRule = new FileSystemAccessRule(UserName, Rights, Inherits, PropagateToChildren, AllowOrDeny);
dSecurity.ModifyAccessRule(AddResetOrRemove, accRule, out ret);
folder.SetAccessControl(dSecurity); return ret; }
#endregion
==========================
你太狠了,不过这段代码应该只能管理员权限才能执行吧,
否则随便一个用户就可以访问所有目录啦?
其实我的需求很简单:
1。能否自己调用UAC的那个开窗
2。然后获得输入的用户名、密码来Start一个Process
3。或者直接提升当前Process的权限
web不可能调用到process,没那个权限,用上面的配置。
我只要在运行过程中判断一个操作失败时,弹出UAC开窗请求管理员权限
startInfo.FileName = Application.ExecutablePath;
startInfo.Arguments = the operation we want to perform;
startInfo.Verb = "runas"; //<--
Process p = Process.Start(startInfo);
QuitCurrentProcess();其他的方法包括:另外写个要求UAC提升的程序,作为'操作服务器',由当前程序调用'操作服务器'来执行任务。这里的'调用'可以用WCF(remoting),COM,Socket等来实现。
======================
和我的想法差不多:
我准备在需要管理员权限时,弹出UAC开窗获得Administrator用户名密码,另开个Process来执行操作
但现在的问题是:如果弹出UAC开窗并获得Administrator用户名密码?
难道要我模拟个UAC开窗?
===================================
用manifest,level="requireAdministrator"。只能在程序启动前弹出UAC啊,
我要的程序运行过程中,执行需要管理员权限的操作时,弹出UAC。晕死
谢谢!
我也是用了,主要是在win7上启动cmd.exe然后实现bcdedit的配置,结果runas后的cmd.exe是syswow64的管理员权限,提示bcdedit不存在,如果有在win7系统下是用管理员权限调用cmd的方面的解决方案,还请告知,先行谢过!