C#中,以下问题:
1。如何判断哪个动作需要管理员权限?
比如运行时向Program Files子目录下写入文件时,怎么知道当前用户权限不够?
2。在知道当前权限不够的情况下,如果弹出UAC(用户权限控制开窗),来动态提升当前进程权限?
不是在程式运行前通过Run As等提升,而是进程已启动后,在一个操作没有权限的情况下,开启UAC开窗以获得管理员权限

解决方案 »

  1.   

    加上mainfest文件,或者将其作为资源编译,具体参考《windows核心编程》第四章
      

  2.   

    http://moosdau.blog.163.com/blog/static/4371128200882231911531/
    动态代码控制,倒没有做过
      

  3.   

    1
    try..catch 分析message 
    2
    window系统说 你的要求很过分,
    目前你可以在运行前或者运行后使用run as 或者某种api提升进程的权限,无法为某个操作提升权限
      

  4.   

    晕死,都说了不是在运行前控制我的程式绝大部分不需要管理员权限,但设定档放在安装目录下
    因此保存设定时就需要管理员权限
    也不要跟我说将设定档放到ApplicationData下,因为客户不希望将一个产品的文件分在不同目录下存放,那样他觉得很乱。
      

  5.   

    其实这个需求应该很正常呀,我需求权限,就弹出UAC开窗通知用户输入Administrator密码来获得权限,又不是后台默默的提升权限,过分吗?
      

  6.   

    右键你的工程,新建一个mainfest(应用程序清单)文件,
     <!-- 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后,保存运行。当程序需要管理员权限时,就会提示用户是否允许。
      

  7.   

    Kylinone(Kylinone) 
    =======================
    我的需求是程序运行中,而不是程式运行前就以管理员身份运行
    因为我的程序绝大部分情况下只需普通用户权限,仅在保存设定时需求弹出个UAC开窗提示进程权限
      

  8.   

    这个好办啥!
            #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
      

  9.   

    Tsapi
    ==========================
    你太狠了,不过这段代码应该只能管理员权限才能执行吧,
    否则随便一个用户就可以访问所有目录啦?
    其实我的需求很简单:
    1。能否自己调用UAC的那个开窗
    2。然后获得输入的用户名、密码来Start一个Process
    3。或者直接提升当前Process的权限
      

  10.   

    那直接在webconfig中添加超级用户就可以了。<identity impersonate="true" userName ="" password ="" />
    web不可能调用到process,没那个权限,用上面的配置。
      

  11.   

    我不要静态的提升权限,
    我只要在运行过程中判断一个操作失败时,弹出UAC开窗请求管理员权限
      

  12.   

    安全意识很不错:)最简单的做法是:重启自己,并要求提升:...
    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等来实现。
      

  13.   

    其他的方法包括:另外写个要求UAC提升的程序,作为'操作服务器',由当前程序调用'操作服务器'来执行任务。这里的'调用'可以用WCF(remoting),COM,Socket等来实现。
    ======================
    和我的想法差不多:
    我准备在需要管理员权限时,弹出UAC开窗获得Administrator用户名密码,另开个Process来执行操作
    但现在的问题是:如果弹出UAC开窗并获得Administrator用户名密码?
    难道要我模拟个UAC开窗?
      

  14.   

    8#和2#的朋友已经给出建议,用manifest,level="requireAdministrator"。
      

  15.   

    gomoku (IDynamicObject) 
    ===================================
    用manifest,level="requireAdministrator"。只能在程序启动前弹出UAC啊,
    我要的程序运行过程中,执行需要管理员权限的操作时,弹出UAC。晕死
      

  16.   

    突然有个想法:在程序运行过程中,执行需要管理员权限的操作,另开个Process执行标有manifest,level="requireAdministrator" 的exe,运行进程通信,将程序中要执行的操作转动该exe中执行嗯,我试试
      

  17.   

    请参考这个:http://blog.csdn.net/liushuijinger/article/details/8463574
    谢谢!
    我也是用了,主要是在win7上启动cmd.exe然后实现bcdedit的配置,结果runas后的cmd.exe是syswow64的管理员权限,提示bcdedit不存在,如果有在win7系统下是用管理员权限调用cmd的方面的解决方案,还请告知,先行谢过!