win7 NSIS安装包: 以管理员身份运行的程序 怎么获得系统当前用户的信息

sinkileu 2010-08-19 10:53:20
比如,当前用户不是管理员,一旦以管理员身份运行程序,程序中USERPROFILE环境变量的值,就变成管理员的USERPROFILE了,有没有办法在程序中获取系统当前用户(非管理员)的USERPROFILE值?

说说出现这个问题的背景,我自己做了个安装程序, 它的安装目录不是由用户选的,而是固定安装在当前用户的目录,比如,Win7下用户名为abc时, 是安装到这里:"C:\Users\abc\AppData\XXXSoft\",也就是说,每个用户安装以后,都在不同的目录。
但我是用NSIS做的安装包, NSIS安装包是以管理员身份运行的,结果,全安装到一起了(都安装到管理员目录了),晕。。。

希望有达人帮助我, 感激~~
...全文
4453 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
無_1024 2012-11-09
  • 打赏
  • 举报
回复
咨询一下楼主是怎么解决的?是否是采用NSIS的一个UAC插件?还是有其他的方法?
bajoige 2011-12-16
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 drifter250771 的回复:]
引用 14 楼 xman_78tom 的回复:
在命令行中直接运行 wmic path win32_computersystem get username 可以获取当前登录帐户。经过测试,即使是以管理员身份运行,也可以正确的获取。


测试可行
[/Quote]
我也试着学习了一下,可以找到当前最后登陆用户。
lvqian_wuhan 2010-12-09
  • 打赏
  • 举报
回复
楼主,到底是怎么解决的呢?
Yothan 2010-09-02
  • 打赏
  • 举报
回复
不结贴,也不说出解决方法。。
sinkileu 2010-08-23
  • 打赏
  • 举报
回复
谢谢各位, 安装包的问题已经通过其它方便来解决了.
sinkileu 2010-08-19
  • 打赏
  • 举报
回复
不行的. 试过了. 环境变量已经是管理员的环境变量了.
就是just4 2010-08-19
  • 打赏
  • 举报
回复
"有没有办法在程序中获取系统当前用户(非管理员)的USERPROFILE值"

直接调用系统环境变理,比如:

echo %userprofile%
drifter250771 2010-08-19
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 xman_78tom 的回复:]
在命令行中直接运行 wmic path win32_computersystem get username 可以获取当前登录帐户。经过测试,即使是以管理员身份运行,也可以正确的获取。
[/Quote]

测试可行
xman_78tom 2010-08-19
  • 打赏
  • 举报
回复
wmi 中 win32_computersystem 类的 username 属性

在命令行中直接运行 wmic path win32_computersystem get username 可以获取当前登录帐户。经过测试,即使是以管理员身份运行,也可以正确的获取。
sinkileu 2010-08-19
  • 打赏
  • 举报
回复
wmic path win32_computersystem get username
这是什么意思呢? 不明白

刚找到了WTSQuerySessionInformation, 可以试一下
drifter250771 2010-08-19
  • 打赏
  • 举报
回复
这个函数估计是谁运行,获取的是谁
xman_78tom 2010-08-19
  • 打赏
  • 举报
回复
wmic path win32_computersystem get username
可以获取当前的登录帐户
sinkileu 2010-08-19
  • 打赏
  • 举报
回复
是呀, 应该是有的.
drifter250771 2010-08-19
  • 打赏
  • 举报
回复
我想一定有某个wmi函数可以判断当前控制台登录的用户名,就如同我们在任务管理器用户标签看到的谁是console一样

可惜找不到资料
sinkileu 2010-08-19
  • 打赏
  • 举报
回复
嗯, 刚才也看到了Win7下这个LogonUI, 遗憾的是, XP下没有这个注册表项, 说明不是一个统一的注册表项, 需要判断OS, 做起来可能有风险...

谢谢.
xman_78tom 2010-08-19
  • 打赏
  • 举报
回复
可以通过 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI] 注册表项获取最后一次登录的帐户名,这个账户就是当前的登录账户。
有了它,其他的东西应该就好办了。
sinkileu 2010-08-19
  • 打赏
  • 举报
回复
谢谢xman_78tom.

但是我看了一下ProfileList所列的是目前已经登录的帐户, 如果已经登录了多个帐户(切换帐户), 就会有多个RefCount大于0了, 这时怎么区分呢?

不过您给出了一个思路, 就是在注册表中查到当前Windows帐户的信息. 但我试了下, 目前还没有找到有用的注册表项. 重要的一点是: 当以管理员身份运行的程序去访问HKEY_CURRENT_USER时, 得到的信息都是管理员的, 而不是当前登录的Windows帐户的信息, 这让人比较郁闷.

继续努力中, 谢谢.
xman_78tom 2010-08-19
  • 打赏
  • 举报
回复
可以通过注册表项获取。
在 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList] 项下
以管理员身份运行时,除了当前登录帐户对应的项下的 refcount 值等于 1 外,administrator 帐户对应的项(S-1-5-domain-500)下的 RefCount 也会大于 0。

因此,只需要查找到除 S-1-5-domain-500(对应 administrator 帐户)和 S-1-5-18(对应 system 帐户)以外的,refcount 等于 1 的项,就可以定位当前登录帐户所使用的配置目录(项下的 ProfileImagePath 值)。
sinkileu 2010-08-19
  • 打赏
  • 举报
回复
但是已经有软件做到了, 正在研究. 各位有线索的话欢迎提供, 非常感谢
drifter250771 2010-08-19
  • 打赏
  • 举报
回复
好像没什么办法,要不你重新写个,管理员运行安装程序后就安装到所有用户的路径下去吧

18,124

社区成员

发帖
与我相关
我的任务
社区描述
Windows客户端使用相关问题交流社区
社区管理员
  • Windows客户端使用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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