Win2008如何判断是否需要Admin权限?

zmy0611 2010-02-03 11:38:07
我写了个更新程式,如果安装程式是装在系统目录ProgramFile下,则需要Admin权限运行更新程式才会有权限更新。而如果安装在普通目录下,则当前登录用户运行就能更新了。
现在的问题是:我在更新程式的exe上加了UAC安全控制了,无论哪种情况UAC都会自动提示要求输入Admin帐户才运行
如何在当前登录用户有权限更新时,不用提示输入Admin帐户呢?
...全文
215 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnzdgs 2010-02-05
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 zmy0611 的回复:]
否则用RunAs重新加载自己,(此时要求输入管理员密码)
====================
这段的C#代码有吗?
[/Quote]
例如:
[DllImport("shell32.dll")]
private static extern int ShellExecute(int hwnd, String lpOperation, String lpFile, String lpParameters, String lpDirectory, int nShowCmd);

ShellExecute(0, "RunAs", Application.ExecutablePath, null, null, 1);
cnzdgs 2010-02-04
  • 打赏
  • 举报
回复
进程的用户身份是在程序加载时确定的,不能动态改变。一般的做法是:程序首先检查本进程的用户身份是否符合运行的需要,如果符合则正常运行;否则用RunAs重新加载自己,(此时要求输入管理员密码),然后退出本进程。exe本身不要求管理员身份。
robinwjb 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 zmy0611 的回复:]
晕死,上面的方法没用,产生了Manifest文件文件后还得重新编译exe
[/Quote]

外置的Manifest无需重新编译exe啊。能否把你的Manifest文件贴出来?
zmy0611 2010-02-04
  • 打赏
  • 举报
回复
晕死,上面的方法没用,产生了Manifest文件文件后还得重新编译exe
卧_槽 2010-02-04
  • 打赏
  • 举报
回复
如果是Vista就别折腾了,那东西狂差。
zmy0611 2010-02-04
  • 打赏
  • 举报
回复
否则用RunAs重新加载自己,(此时要求输入管理员密码)
====================
这段的C#代码有吗?
zmy0611 2010-02-04
  • 打赏
  • 举报
回复
我现在的做法是:正常情况下更新程式的文件名为A.exe, 如果需要Admin权限,则改文件名为Update.exe
zmy0611 2010-02-04
  • 打赏
  • 举报
回复
例如exe文件名:A.exe, 同目录下Manifest文件文件名:A.exe.Manifest, 其内容如下:
<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="requireAdministrator"
uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</asmv1:assembly>
========================================
不起作用
热情的菜鸟 2010-02-03
  • 打赏
  • 举报
回复
[DllImport("advapi32.dll", EntryPoint="GetUserName")]
public static extern int GetUserName (
string lpBuffer,
ref int nSize
);

lpBuffer ------- String,一个字串缓冲区,预先初始化成由nSize指定的长度。它将用于容纳用户名

nSize ---------- Long,初始化成lpBuffer的长度。返回以后,它会包含载入lpBuffer的字符数量
热情的菜鸟 2010-02-03
  • 打赏
  • 举报
回复
API GetUserName
LIU312591 2010-02-03
  • 打赏
  • 举报
回复
试试属性里面设置添加用户控制-添加用户完全控制。试试
robinwjb 2010-02-03
  • 打赏
  • 举报
回复
楼主的方法倒是简单实用。呵呵
zmy0611 2010-02-03
  • 打赏
  • 举报
回复
我已经想好怎么做了:更新时将未提升权限的Update.exe Copy到当前用户的appdata目录下,在根据当前用户对目标文件夹是否有写的权限,动态产生一个Manifest文件,再执行该Update.exe
多谢robinwjb
zmy0611 2010-02-03
  • 打赏
  • 举报
回复
robinwjb:说到点子上了,
但就是动态要求管理员权限怎么做?你提供的那个地址看起来好累,有现成的吗?
robinwjb 2010-02-03
  • 打赏
  • 举报
回复
楼主的“在更新程式的exe上加了UAC安全控制了”指的是通过添加Manifest文件来
设置requestedexecutionlevel level="requireAdministrator"吗?

如果是这样的话,那么你的Update.exe在一起动就会弹出UAC的对话框了吧。
要完成楼主的要求,可以试试下面的思路:

1.不要继续使用上面的requestedexecutionlevel level方法,也就是说程序在一开始是没有
提升权限的。

2.在目标目录下建立一个文件,如果成功则什么都不用做,如果失败并且得到的错误信息是"没有足够的权限"的话,动态要求管理员权限。(可以使用COM Elevation Moniker。参考:http://msdn2.microsoft.com/en-us/library/ms679687.aspx)
jasper 2010-02-03
  • 打赏
  • 举报
回复
楼主是台湾的吗?
iishou88 2010-02-03
  • 打赏
  • 举报
回复
帮顶
wendy_fw 2010-02-03
  • 打赏
  • 举报
回复
先取得目前用戶, 再判斷權限, 有則彈出, 沒有就不彈出.
zmy0611 2010-02-03
  • 打赏
  • 举报
回复
楼上,不行的,需要更新的文件就是安装目录下的所有文件
更新就是升级,就象QQ在线升级
你妹的特盗不 2010-02-03
  • 打赏
  • 举报
回复
把需要更新的文件不要放在安裝目錄下面,放到當前用戶的目錄下面 象appdata 這些目錄下面
這樣的不好就是,換個用戶後,那些配置或什么信息就是空的,
加载更多回复(1)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧