wix customaction UAC dtf
wix customaction UAC dtf
我正在为 IIS 网站创建 Wix 安装程序,可能 UI 选择网站、应用程序池并选择虚拟目录。事情是:我成功创建了安装程序,它在关闭 UAC 的情况下工作,但 UAC 设置为最大。我收到错误 - 来自 MSI 日志:
MSI (c) (A0:C8) [16:41:21:692]:调用远程自定义操作。 DLL:C:\Users\kovac\AppData\Local\Temp\MSI1AEF.tmp,入口点:EnumerateIISWebSitesAndAppPools
MSI (c) (A0:CC) [16:41:21:692]:启用伪装。
MSI (c) (A0:CC) [16:41:21:692]: 在服务器上调用安装之前尝试启用所有禁用的权限
MSI (c) (A0:CC) [16:41:21:692]:连接到 CA 接口服务。
SFXCA:将自定义操作提取到临时目录:C:\Users\kovac\AppData\Local\Temp\MSI1AEF.tmp-\
SFXCA:绑定到 CLR 版本 v4.0.30319
调用自定义操作 WebAppInstallCustomActions!WebAppInstallCustomActions.CustomActions.EnumerateIISWebSitesAndAppPools
枚举 IISWebSitesAndAppPools:开始
EnumerateIISWebSitesAndAppPools:尝试 运行 没有管理员权限
CustomAction EnumerateIISWebSitesAndAppPools 返回实际错误代码 1603(请注意,如果翻译发生在沙箱内,这可能不是 100% 准确)
操作结束 16:41:23:EnumerateIISWebSitesAndAppPools。 Return 值 3。
MSI (c) (A0:B0) [16:41:23:878]: 执行操作: FatalError
操作 16:41:23:致命错误。
我尝试关注文章 - 我只知道我应该 运行 我的自定义操作与 Impersonate="no" 所以我做了但没有成功
附加信息:UAC 没有询问自定义操作是否可以 运行 是否正确,它只是结束安装程序...
<CustomAction Id="EnumerateIISWebSitesAndAppPools"
BinaryKey="WebAppCA"
DllEntry="EnumerateIISWebSitesAndAppPools"
Execute="immediate"
Return="check" Impersonate="no" />
我还在某处读到,操作需要 运行 延迟 - 但在这种情况下这是不可能的 - 因为我需要在安装之前为用户提供网站列表。
我的问题是如何 运行 具有完全权限的自定义操作 - 在 UAC 开启的情况下,特别是 UAC 与 运行ning CA 上应用的管理员权限有何关系?感谢任何帮助或任何建议...
因为我不知道重要性和问题域,所以我宁愿附加用 C# 编写的自定义操作脚本:
/// <summary>
/// Adds the II7 web sites and the application pool names to the
/// ComboBox table in the MSI file.
/// </summary>
/// <param name="session">
/// The installer session.
/// </param>
/// <returnenter code heres>
/// Always returns ActionResult.Success, otherwise rethrows the error
/// encountered.
/// </returns>
/// <exception cref="ArgumentNullException">
/// Thrown if the <paramref name="session"/> parameter is null.
/// </exception>
[CustomAction]
public static ActionResult EnumerateIISWebSitesAndAppPools(
Session session)
{
Debugger.Launch();
if (null == session)
{
throw new ArgumentNullException("session");
}
session.Log("EnumerateIISWebSitesAndAppPools: Begin");
// Check if running with admin rights and if not, log a message to
// let them know why it's failing.
if (false == HasAdminRights())
{
session.Log("EnumerateIISWebSitesAndAppPools: " +
"ATTEMPTING TO RUN WITHOUT ADMIN RIGHTS");
return ActionResult.Failure;
}
session.Log("EnumerateIISWebSitesAndAppPools: " +
"Getting the IIS 7 management object");
ActionResult result;
using (ServerManager iisManager = new ServerManager())
{
result = EnumSitesIntoComboBox(session, iisManager);
if (ActionResult.Success == result)
{
result = EnumAppPoolsIntoComboBox(session, iisManager);
}
}
session.Log("EnumerateIISWebSitesAndAppPools: End");
return result;
}
private static ActionResult EnumSitesIntoComboBox(Session session,
服务器管理器 iisManager)
{
尝试
{
// Debugger.Break();
session.Log("EnumSites: Begin");
// Grab the combo box but make sure I'm getting only the one
// from WebAppInstallDlg.
View view = session.Database.OpenView(
"SELECT * FROM ComboBox WHERE ComboBox.Property='WEBSITE_NAME'");
view.Execute();
Int32 index = 1;
session.Log("EnumSites: Enumerating the sites");
foreach (Site site in iisManager.Sites)
{
// Create a record for this web site. All I care about is
// the name so use it for fields three and four.
session.Log("EnumSites: Processing site: {0}", site.Name);
Record record = session.Database.CreateRecord(4);
record.SetString(1, "WEBSITE_NAME");
record.SetInteger(2, index);
record.SetString(3, site.Name);
record.SetString(4, site.Name);
session.Log("EnumSites: Adding record");
view.Modify(ViewModifyMode.InsertTemporary, record);
index++;
}
view.Close();
session.Log("EnumSites: End");
}
catch (Exception ex)
{
session.Log("EnumSites: exception: {0}", ex.Message);
throw;
}
return ActionResult.Success;
}
static bool HasAdminRights()
{
WindowsIdentity identity = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(identity);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
UI 序列中安排的所有 ca 必须立即执行。模拟不适用于直接 ca。最佳做法是 UI 不提升,因此最佳做法表示 CA 不应要求提升权限。如果没有办法解决这个问题,您将需要使用引导程序来调用 MSI 并在调用之前提升它。
您使用对话框在 UI 模式下收集数据,这将设置一堆属性,然后您可以在没有 UI 的延迟自定义操作中使用这些属性。如果您将软件包 InstallPrivileges 设置为提升的,则延迟 CA 运行 具有您需要的权限。如果您真的想在您编写的代码中执行所有这些操作,运行 在安装后使用提升清单来配置网站内容。
或者看看 WiX IIS 扩展是否能满足您的需求。或者也许是这样的:
http://www.codeproject.com/Articles/115036/Creating-WIX-Installer-for-ASP-NET-Web-Application
这一切都已经做过很多次了,不值得重新发明它。
我正在为 IIS 网站创建 Wix 安装程序,可能 UI 选择网站、应用程序池并选择虚拟目录。事情是:我成功创建了安装程序,它在关闭 UAC 的情况下工作,但 UAC 设置为最大。我收到错误 - 来自 MSI 日志:
MSI (c) (A0:C8) [16:41:21:692]:调用远程自定义操作。 DLL:C:\Users\kovac\AppData\Local\Temp\MSI1AEF.tmp,入口点:EnumerateIISWebSitesAndAppPools MSI (c) (A0:CC) [16:41:21:692]:启用伪装。 MSI (c) (A0:CC) [16:41:21:692]: 在服务器上调用安装之前尝试启用所有禁用的权限 MSI (c) (A0:CC) [16:41:21:692]:连接到 CA 接口服务。 SFXCA:将自定义操作提取到临时目录:C:\Users\kovac\AppData\Local\Temp\MSI1AEF.tmp-\ SFXCA:绑定到 CLR 版本 v4.0.30319 调用自定义操作 WebAppInstallCustomActions!WebAppInstallCustomActions.CustomActions.EnumerateIISWebSitesAndAppPools 枚举 IISWebSitesAndAppPools:开始 EnumerateIISWebSitesAndAppPools:尝试 运行 没有管理员权限 CustomAction EnumerateIISWebSitesAndAppPools 返回实际错误代码 1603(请注意,如果翻译发生在沙箱内,这可能不是 100% 准确) 操作结束 16:41:23:EnumerateIISWebSitesAndAppPools。 Return 值 3。 MSI (c) (A0:B0) [16:41:23:878]: 执行操作: FatalError 操作 16:41:23:致命错误。
我尝试关注文章 - 我只知道我应该 运行 我的自定义操作与 Impersonate="no" 所以我做了但没有成功 附加信息:UAC 没有询问自定义操作是否可以 运行 是否正确,它只是结束安装程序...
<CustomAction Id="EnumerateIISWebSitesAndAppPools"
BinaryKey="WebAppCA"
DllEntry="EnumerateIISWebSitesAndAppPools"
Execute="immediate"
Return="check" Impersonate="no" />
我还在某处读到,操作需要 运行 延迟 - 但在这种情况下这是不可能的 - 因为我需要在安装之前为用户提供网站列表。
我的问题是如何 运行 具有完全权限的自定义操作 - 在 UAC 开启的情况下,特别是 UAC 与 运行ning CA 上应用的管理员权限有何关系?感谢任何帮助或任何建议... 因为我不知道重要性和问题域,所以我宁愿附加用 C# 编写的自定义操作脚本:
/// <summary>
/// Adds the II7 web sites and the application pool names to the
/// ComboBox table in the MSI file.
/// </summary>
/// <param name="session">
/// The installer session.
/// </param>
/// <returnenter code heres>
/// Always returns ActionResult.Success, otherwise rethrows the error
/// encountered.
/// </returns>
/// <exception cref="ArgumentNullException">
/// Thrown if the <paramref name="session"/> parameter is null.
/// </exception>
[CustomAction]
public static ActionResult EnumerateIISWebSitesAndAppPools(
Session session)
{
Debugger.Launch();
if (null == session)
{
throw new ArgumentNullException("session");
}
session.Log("EnumerateIISWebSitesAndAppPools: Begin");
// Check if running with admin rights and if not, log a message to
// let them know why it's failing.
if (false == HasAdminRights())
{
session.Log("EnumerateIISWebSitesAndAppPools: " +
"ATTEMPTING TO RUN WITHOUT ADMIN RIGHTS");
return ActionResult.Failure;
}
session.Log("EnumerateIISWebSitesAndAppPools: " +
"Getting the IIS 7 management object");
ActionResult result;
using (ServerManager iisManager = new ServerManager())
{
result = EnumSitesIntoComboBox(session, iisManager);
if (ActionResult.Success == result)
{
result = EnumAppPoolsIntoComboBox(session, iisManager);
}
}
session.Log("EnumerateIISWebSitesAndAppPools: End");
return result;
}
private static ActionResult EnumSitesIntoComboBox(Session session, 服务器管理器 iisManager) { 尝试 { // Debugger.Break(); session.Log("EnumSites: Begin");
// Grab the combo box but make sure I'm getting only the one
// from WebAppInstallDlg.
View view = session.Database.OpenView(
"SELECT * FROM ComboBox WHERE ComboBox.Property='WEBSITE_NAME'");
view.Execute();
Int32 index = 1;
session.Log("EnumSites: Enumerating the sites");
foreach (Site site in iisManager.Sites)
{
// Create a record for this web site. All I care about is
// the name so use it for fields three and four.
session.Log("EnumSites: Processing site: {0}", site.Name);
Record record = session.Database.CreateRecord(4);
record.SetString(1, "WEBSITE_NAME");
record.SetInteger(2, index);
record.SetString(3, site.Name);
record.SetString(4, site.Name);
session.Log("EnumSites: Adding record");
view.Modify(ViewModifyMode.InsertTemporary, record);
index++;
}
view.Close();
session.Log("EnumSites: End");
}
catch (Exception ex)
{
session.Log("EnumSites: exception: {0}", ex.Message);
throw;
}
return ActionResult.Success;
}
static bool HasAdminRights()
{
WindowsIdentity identity = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(identity);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
UI 序列中安排的所有 ca 必须立即执行。模拟不适用于直接 ca。最佳做法是 UI 不提升,因此最佳做法表示 CA 不应要求提升权限。如果没有办法解决这个问题,您将需要使用引导程序来调用 MSI 并在调用之前提升它。
您使用对话框在 UI 模式下收集数据,这将设置一堆属性,然后您可以在没有 UI 的延迟自定义操作中使用这些属性。如果您将软件包 InstallPrivileges 设置为提升的,则延迟 CA 运行 具有您需要的权限。如果您真的想在您编写的代码中执行所有这些操作,运行 在安装后使用提升清单来配置网站内容。
或者看看 WiX IIS 扩展是否能满足您的需求。或者也许是这样的: http://www.codeproject.com/Articles/115036/Creating-WIX-Installer-for-ASP-NET-Web-Application
这一切都已经做过很多次了,不值得重新发明它。