标签: uac

如何将清单<requestedPrivileges>信息添加到delphi项目中

<requestedPrivileges>清单信息添加到Delphi XE项目(.exe)的最简单方法是什么?

是否可以只添加所需的节点,如:

<requestedPrivileges>   
  <requestedExecutionLevel level="requireAdministrator"/> 
</requestedPrivileges>
Run Code Online (Sandbox Code Playgroud)

或者我必须添加整个清单文件,如?

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="VistaLogonCustomizer.exe" type="*"/>
  <description>elevate execution level</description>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
   <security>
     <requestedPrivileges>
      <requestedExecutionLevel level="requireAdministrator"/>
     </requestedPrivileges>
   </security>
  </trustInfo>
  <dependency>
   <dependentAssembly>
     <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" publicKeyToken="6595b64144ccf1df" language="*" processorArchitecture="*"/>
   </dependentAssembly>
  </dependency>
</assembly> 
Run Code Online (Sandbox Code Playgroud)

如果我必须添加整个清单文件,那么我是否与manfest文件中的构建冲突(当项目选项"Activate Runtime-Theme"设置为true时生成)?

delphi uac manifest delphi-xe

17
推荐指数
3
解决办法
2万
查看次数

将应用程序清单嵌入到VB6 exe中

我最近浏览了一堆用VB6编写的独立实用程序应用程序,以确保Windows Vista及更高版本的注册表虚拟化已关闭.我为每个exe创建了一个独立的清单文件,设置得requestedExecutionLevel恰当(其中一些需要修改HKEY_LOCAL_MACHINE注册表项,其他不需要),并测试它们.它们似乎都正常工作.

我只剩下一个小问题.由于它们是独立的实用程序,人们习惯于只在网络上复制它们并手动运行它们.如果有人忘记复制清单文件以及exe,那么exe将静默写入虚拟化注册表项而不是真实注册表项,并导致难以调试的问题.

显而易见的解决方案是将清单作为资源嵌入到exe中.我在网上看到的所有文章都告诉你要嵌入这样的资源:

#define CREATEPROCESS_MANIFEST_RESOURCE_ID 1
#define RT_MANIFEST 24
CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "app.manifest"
Run Code Online (Sandbox Code Playgroud)

这应该工作得很好,除了VB编译器总是创建资源ID = 1的应用程序图标.当我尝试上面的代码时,Windows拒绝运行exe,抱怨资源错误(我将更新此帖子与细节稍后).我尝试将资源ID更改为另一个数字,之后Windows成功运行程序但未识别清单内容.

有没有人知道如何让一个嵌入式清单在VB6 exe中工作,或者我应该坚持使用外部文件?

更新1

上面给出的文本是.rc文件的全部内容.我把它编译成这样的.res文件:

"%ProgramFiles%\Microsoft Visual Studio\VB98\Wizards\rc.exe" /r /fo "Resources.res" "Resources.rc"

并将其嵌入VB6项目文件中,如下所示:

Type=Exe
Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#..\..\..\..\..\..\..\..\WINDOWS\system32\stdole2.tlb#OLE Automation
Form=Main.frm
ResFile32="Resources.res"
IconForm="FMain"
Startup="FMain"
HelpFile=""
Title="Windows Vista Registry Test - VB6"
ExeName32="RegistryTestVB6.exe"
Path32=""
Command32=""
Name="RegistryTestVB6"
HelpContextID="0"
CompatibleMode="0"
MajorVer=1
MinorVer=0
RevisionVer=0
AutoIncrementVer=0
ServerSupportFiles=0
VersionComments="Windows Vista Registry Test - VB6"
VersionCompanyName=""
VersionFileDescription="Windows Vista Registry Test - VB6"
VersionLegalCopyright=""
VersionProductName="Windows Vista Registry Test - …
Run Code Online (Sandbox Code Playgroud)

vb6 resources uac manifest

16
推荐指数
3
解决办法
1万
查看次数

如何签署安装程序以防止Vista的UAC警告

我有一个应用程序,我需要分发,并希望签名,以便我可以避免在Vista中的UAC警告.目前我看到了......

UAC http://img694.imageshack.us/img694/7289/uac.jpg

我正在使用visual studio来创建安装程序,但应用程序不是用.net编写的.我是否需要同时签署.msi中包含的.msi和.exe文件?我需要什么样的钥匙?我应该在哪里拿到钥匙?目前我正在考虑verisign,虽然它们很昂贵我需要这个值得信任.一旦我拿到密钥,我该如何签名?如果我没有找到正确的al.exe和signtool.exe用于.net程序集吗?谢谢!

deployment windows-installer uac code-signing

16
推荐指数
1
解决办法
6331
查看次数

写入"ProgramData"文件夹(W7和Vista).NET

我在"Program Files"目录下安装我的应用程序.我在"ProgramData"目录下安装数据:

Environment.SpecialFolder.CommonApplicationData

在programData中,我创建了用于保存数据的文件夹.例:

C:\ ProgramData\MyApp\MyData\here我有文件和文件夹

在XP下运行良好.但不是在Vista或W7 OS下.

我可以读取此目录中的文件,但我无法写入文件,我无法创建新文件等.用户被记录为管理员.

我可以无限制地存储数据?我需要将商店数据存储在所有用户都可见的文件夹中

编辑:

我在app.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">
  <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
        <!-- Opciones del manifiesto de Control de cuentas de usuario
             Si desea cambiar el nivel de Control de cuentas de usuario de Windows, reemplace el 
             nodo requestedExecutionLevel por alguno de los siguientes.

        <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
        <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
        <requestedExecutionLevel  level="highestAvailable" uiAccess="false" />

            Si desea utilizar la virtualización de archivos …
Run Code Online (Sandbox Code Playgroud)

.net uac programdata windows-vista

16
推荐指数
2
解决办法
2万
查看次数

从非交互式服务启动UAC升级进程(win32/.net/powershell)

我正在使用第三方Windows服务,通过使用CreateProcessAsUser()运行脚本和可执行文件来处理一些自动化任务.由于UAC,我在Windows Server 2008上遇到了问题,并且通过API处理LUA提升的方式.

该服务作为LocalSystem运行,并且未启用"Interact With Desktop".这些进程作为Administrators组中的用户运行,但不是管理员帐户(免除许多UAC限制).所有UAC默认设置都已到位.

我可以将任意命令或powershell代码传递给服务,但我似乎无法"突破"由服务启动的非提升的非交互式进程.

问题的症结似乎是启动提升过程的唯一(公共)API选项是具有'runas'动词的ShellExecute(),但据我所知,无法从非交互式调用服务或您收到"此操作需要交互式窗口站"之类的错误.

我发现的唯一解决方法在这里提到:http: //www.eggheadcafe.com/software/aspnet/29620442/how-to-proper-use-sendinp.aspx

在Vista中,官方记录的提升进程的方法仅使用shell API ShellExecute(Ex)(不是CreateProcess或CreateProcessAsUser).因此,您的应用程序必须调用ShellExecute(Ex)来启动升级的帮助程序以调用SendInput.此外,由于Session 0隔离,服务只能使用CreateProcessAsUser或CreateProcessWithLogonW(不能使用ShellExecute(Ex))来指定交互式桌面.

..我认为没有直接的方法从Windows服务产生提升的进程.我们只能首先使用CreateProcessAsUser或CreateProcessWithLogonW将非提升的进程生成到用户会话(交互式桌面)中.然后在非提升的进程中,它可以使用ShellExecute(Ex)为真实任务生成提升的进程.

要从.net/powershell代码执行此操作,看起来我必须做一些精心设计的P/Invoke来调用CreateProcessAsUser或CreateProcessWithLogonW,因为.Net System.Diagnostics.ProcessStartInfo没有相应的lpDesktop,我可以设置为"winsta0\default".而且我不清楚LocalSystem是否有权调用CreateProcessAsUser或CreateProcessWithLogonW.

我还查看了 http://blogs.msdn.com/alejacma/archive/2007/12/20/how-to-call-createprocesswithlogonw-createprocessas-in-net.aspxProcess.Start与UAC的不同凭据

基于这一切,我得出结论,没有直接的方法来做到这一点.我错过了什么吗?这看起来真的不应该那么难.感觉UAC从未被设计用于处理非交互式用例.

如果有任何微软人员最终阅读此内容,我注意到ShellExecute内部处理提升的方式是通过调用应用程序信息服务(AIS).为什么通过某些Win32或.NET API不能同样调用AIS? http://msdn.microsoft.com/en-us/library/bb756945.aspx

抱歉,跑了一会儿.谢谢你的任何想法.

winapi uac shellexecute createprocessasuser

16
推荐指数
1
解决办法
2万
查看次数

为NSIS安装程序设置UAC"发布者"字段

当我打开我的安装程序(我使用NSIS创建)时,会出现UAC对话框,其中包含有关我的安装程序的信息.字段Publisher是"未知".我听说过对应用程序进行数字签名,您知道如何在NSIS中执行此操作吗?

如何将字段/属性Publisher设置为"我的安装程序"或其他文本?

我认为下面的代码应该设置Publisher字段,但它没有,它仍然是'未知':

InstallDir  "abc"
Name        "def"        
OutFile     "def.exe"

VIProductVersion                 "1.0.0.0"
VIAddVersionKey ProductName      "def"
VIAddVersionKey Comments         "MY DESCRIPTION"
VIAddVersionKey CompanyName      "My Installer"
VIAddVersionKey LegalCopyright   "MY COMPANYNAME"
VIAddVersionKey FileDescription  "MY DESCRIPTION"
VIAddVersionKey FileVersion      1
VIAddVersionKey ProductVersion   1
VIAddVersionKey InternalName     "def"
VIAddVersionKey LegalTrademarks  "PTY LTD"
VIAddVersionKey OriginalFilename "def.exe"

Section
    DetailPrint "Hello World"
SectionEnd
Run Code Online (Sandbox Code Playgroud)

uac nsis

16
推荐指数
2
解决办法
2万
查看次数

C#:什么是部分受​​信任的来电者?

我没有在一个页面中看到这个明确定义:部分受信任的呼叫者.

我正在研究APTCA并且总是提到这一点,但是MSDN没有关于它的文章.

我只有一些线索,但我不是百分百肯定.

  • 从网络共享执行的代码是否符合"部分受信任的呼叫者"的条件?即使我们以管理员身份运行它(Windows UAC)?
  • .NET App作为"部分受信任"运行的其他方式有哪些?
  • 什么是ASP.net环境中的"部分受信任的呼叫者"?

我遇到过许多文章,提到有关部分可信赖的呼叫者的业务,但没有直接定义它们本身的内容.

.net security uac code-access-security

16
推荐指数
1
解决办法
1936
查看次数

使用UAC打开具有不同凭据的Process.Start

我正在尝试使用在启用UAC的情况下以不同凭据运行的Process.Start启动另一个进程.我收到以下错误:

System.ComponentModel.Win32Exception:登录失败:用户帐户限制.可能的原因是不允许空密码,登录时间限制,或限制的政策已在System.Diagnostics.Process.StartWithCreateProcess(的ProcessStartInfo的StartInfo)在System.Diagnostics.Process.Start()被强制
在System.Diagnostics.Process.Start( ProcessStartInfo startInfo)

如果我关闭UAC,它可以正常工作.如果我在没有指定用户名和密码的情况下启动该过程,它可以正常工 下面是代码的副本:

            ProcessStartInfo processInfo = new ProcessStartInfo();
            processInfo.Verb = "runas";
            processInfo.FileName = command;
            processInfo.Arguments = parameters;
            processInfo.UserName = txtUserName.Text;
            processInfo.Password = password;
            processInfo.Domain = "myDomain";
            processInfo.UseShellExecute = false;
            processInfo.LoadUserProfile = true;

            Process.Start(processInfo);
Run Code Online (Sandbox Code Playgroud)

我相信这与桌面会话有关,但我不确定为什么它在UAC关闭时有效.

关于如何在不关闭UAC,修改注册表或更改本地/组策略的情况下使其工作的任何想法都将非常受欢迎.

谢谢

编辑

具有上述代码的进程以管理员身份启动:

      static void Main(string[] args)
      {
         //make sure we are running with admin privileges
         if (VerifyIsAdmin())
         {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MyApp(args));
         }
      }

      private static bool VerifyIsAdmin()
      {
         WindowsPrincipal principal = new WindowsPrincipal(WindowsIdentity.GetCurrent());
         bool isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);
         if (!isAdmin) …
Run Code Online (Sandbox Code Playgroud)

.net c# uac windows-vista

15
推荐指数
1
解决办法
3万
查看次数

在C#中处理UAC的正确方法

我有一个应用程序(Windows服务)安装在Program Files文件夹中的目录中.除此应用程序外,还有另一个WinForms应用程序,用于配置服务(以及其他内容).在进行配置时,它会将更改保存到与服务一起存在的配置文件中.

在Vista/Win7上运行时,UAC会阻止用户保存到配置文件.我想做的是:

  • 将屏蔽图标放在用于配置的菜单项旁边
  • 选择此项时提示输入UAC权限
  • 仅在需要它的操作系统上显示图标/提示
  • 仅在需要权限时显示图标/提示符(例如,如果应用程序安装在不需要UAC权限的地方)

我真的不想以管理员身份运行整个应用程序,因为它还用于不需要UAC权限的其他目的(因此设置应用程序清单文件不是正确的解决方案).我也假设(纠正我,如果我错了),一旦授予UAC权限,我的现有流程就无法执行操作,我需要启动一个新流程.

我怎样才能做到最好?

.net c# uac

15
推荐指数
2
解决办法
2万
查看次数

Delphi 7 vista/windows 7清单

有没有人有一个Delphi 7清单文件的例子,允许应用程序在Windows XP/Vista/7上以管理员身份运行?

使用此功能运行应用程序通常会导致用户帐户控制(UAC)对话框询问特权权限.

delphi uac manifest delphi-7

15
推荐指数
3
解决办法
2万
查看次数