Request Windows Vista UAC elevation if path is protected?

冷暖自知 提交于 2019-12-17 04:31:20

问题


For my C# app, I don't want to always prompt for elevation on application start, but if they choose an output path that is UAC protected then I need to request elevation.

So, how do I check if a path is UAC protected and then how do I request elevation mid-execution?


回答1:


The best way to detect if they are unable to perform an action is to attempt it and catch the UnauthorizedAccessException.

However as @DannySmurf correctly points out you can only elevate a COM object or separate process.

There is a demonstration application within the Windows SDK Cross Technology Samples called UAC Demo. This demonstration application shows a method of executing actions with an elevated process. It also demonstrates how to find out if a user is currently an administrator.




回答2:


Requesting elevation mid-execution requires that you either:

  1. Use a COM control that's elevated, which will put up a prompt
  2. Start a second process that is elevated from the start.

In .NET, there is currently no way to elevate a running process; you have to do one of the hackery things above, but all that does is give the user the appearance that the current process is being elevated.

The only way I can think of to check if a path is UAC elevated is to try to do some trivial write to it while you're in an un-elevated state, catch the exception, elevate and try again.




回答3:


I'm not sure if it is of any help for you but you can take a look at this blog post:

http://haishibai.blogspot.com/2010/01/tiy-try-out-windows-7-uac-using-c-part_26.html




回答4:


You may want to notify the user that the path is protected and ask them to output the file to a "safer" area. This way your app will not need elevation. I'm sure it depends on your users and what you are trying to do, however I don't think it's too much to kindly let the user know you don't feel ok dumping xyz into the Windows/System32 folder.




回答5:


If your secondary drive has it's own file permissions, like say you have an other copy of windows installed on it. It will prompt.

It will also prompt if files are in use, which sometimes occurs if you have windows explorer open to the same directory and the file selected with a file previewer displaying the contents... there are some other oddities, but generally you get asked for file permission if the file is in use or it's a sensitive directory.

If you do loop the FolderBrowserDialog , make sure to notify the user why, so they dont get mad at your app.

Note: it does stink there is no .net way of asking for permission, maybe p/invoke the win32 api...?




回答6:


UAC can elevate object based on their GUID, this would (In theory) mean that any class with a GUID can be elevated, The UACDemo should also show how to do this



来源:https://stackoverflow.com/questions/17533/request-windows-vista-uac-elevation-if-path-is-protected

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!