日志标签:win8

win7、winvista、win8-NSIS不能删除其打包的程序桌面快捷方式、开始程序的启动目录及快捷方式的解决方式

时间:2013年08月23日作者:小侃评论次数:0

如果英文好的可以直接看最下面的官方提供的文档,那在此之前呢,我来帮大家介绍下:

其实呢,很简单,主要是因为在默认的情况下,我们用CreateShortcut是在我们本机上面的所有用户(账号)都创建了开始菜单的快捷方式,但是当我们用delete或者是RMDir的时候,其实只能删除我们当前用户的快捷方式,但是其他用户的快捷方式可不是还留在那嘛!所以你其实看到快捷方式删不掉是一种假象,你自己账户的是删除了的,但是现实出来的,是其他账户的。那么无论是哪个账户的,至少我们做了一个安装包,用户使用完了卸载完了,还看见开始菜单有这个始终不是好事,所以呢官方给我们提出了两种解决方案。

解决方案:

1.在当前用户下创建快捷方式。只需添加RequestExecutionLevel user即可。

RequestExecutionLevel user

Section
  CreateDirectory "$SMPROGRAMS\Vista Test"
  CreateShortcut  "$SMPROGRAMS\Vista Test\hello.lnk" $WINDIR\notepad.exe
  WriteUninstaller $EXEDIR\uninst.exe
SectionEnd

Section uninstall
  Delete "$SMPROGRAMS\Vista Test\hello.lnk"
  RMDir "$SMPROGRAMS\Vista Test"
SectionEnd

2.删除所有用户下的快捷方式。首先添加RequestExecutionLevel admin,然后在创建快捷方式和删除快捷方式的地方加上SetShellVarContext all即可。

RequestExecutionLevel admin #NOTE: You still need to check user rights with UserInfo!

Section
  SetShellVarContext all
  CreateDirectory "$SMPROGRAMS\Vista Test"
  CreateShortcut  "$SMPROGRAMS\Vista Test\hello.lnk" $WINDIR\notepad.exe
  WriteUninstaller $EXEDIR\uninst.exe
SectionEnd

Section uninstall
  SetShellVarContext all
  Delete "$SMPROGRAMS\Vista Test\hello.lnk"
  RMDir "$SMPROGRAMS\Vista Test"
SectionEnd

 

这是NSIS提供给我们的官方文档(看不懂的我下面有翻译):

Windows Vista and Windows 7 automatically identifies installer executables, including NSIS installers, and asks the user permission to run them with elevated privileges. Automatic detection, however, comes with the price of automatic backward compatibility tricks. One of which is automatic relocation of shortcuts created in the Start Menu to All Users’ Start Menu.

To workaround this, use the new RequestExecutionLevel command or create the shortcuts in All Users’ folders in the first place, using SetShellVarContext.

OutFile vista.exeName Vista RequestExecutionLevel user Section CreateDirectory “$SMPROGRAMS\Vista Test” CreateShortcut “$SMPROGRAMS\Vista Test\hello.lnk” $WINDIR\notepad.exe WriteUninstaller $EXEDIR\uninst.exeSectionEnd Section uninstall Delete “$SMPROGRAMS\Vista Test\hello.lnk” RMDir “$SMPROGRAMS\Vista Test”SectionEndOutFile vista.exeName Vista RequestExecutionLevel admin #NOTE: You still need to check user rights with UserInfo! Function .onInit#TODO: call UserInfo plugin to make sure user is adminFunctionEnd Section SetShellVarContext all CreateDirectory “$SMPROGRAMS\Vista Test” CreateShortcut “$SMPROGRAMS\Vista Test\hello.lnk” $WINDIR\notepad.exe WriteUninstaller $EXEDIR\uninst.exeSectionEnd Section uninstall SetShellVarContext all Delete “$SMPROGRAMS\Vista Test\hello.lnk” RMDir “$SMPROGRAMS\Vista

 

官方文档的翻译(只有一二段,因为第三段是一个示例源码,看不懂的就自己去学NSIS语法啦~):

Windows Vista and Windows 7会自动识别包括NSIS安装程序在内的可执行的安装程序,并且会询问用户是否给予他们更高的运行权限。然而呢,自动检测就附带了一个自动向后兼容的代价。那么这些代价中的一个呢,就是帮助安装程序在创建快捷方式时自动重新配置,在所有用户的开始菜单上新建了快捷方式。

为了避免这个,我们可以使用一个新的命令:RequestExecutionLevel 或者在所有用户目录创建快捷方式之前使用这个命令:using SetShellVarContext.

C#编写软件实现在Vista、Win7、win8桌面版下“以管理员身份运行”验证过程

时间:2013年08月16日作者:小侃评论次数:0

VISTA、Windows 7、Windows 8都使用了UAC来控制程序访问,对于一些需要使用管理员身份运行的程序就得右键以管理员身份运行。

C#编程中可以使程序自动使用管理员身份运行,也就是我们常常看到一些程序的图标上会冒出个盾牌。

开启软件编译使用Administrator验证运行的方法如下:

在源码的Properties目录中找到 app.manifest, 将其中level=”asInvoker” 改成 level=”requireAdministrator”就可以了。

如果没有app.manifest文件可以打开项目属性,找到安全性项,勾上启用 ClickOnce 安全设置,这时会生成app.manifest文件,然后再把勾去掉,不要选上。

这样你重新编译,你的程序图标上就会出现个小盾牌了,就自动以管理员身份运行你的程序,无需右键打开。