如何在Powershell中指定复杂的发布商名称?

时间:2016-09-15 19:57:02

标签: powershell signtool makecert desktop-bridge desktop-app-converter

我正在尝试使用Microsoft桌面应用转换器(AKA桌面桥),我们的发布商名称中包含逗号,空格和句点。

例如。 CN="Acme, Inc."

这不起作用:

DesktopAppConverter.exe -Installer .\Installer.msi -Destination AppxFolder -PackageName "AcmeApp" -Publisher "CN=Acme, Inc." -Version 1.0.0.0 -MakeAppx

我尝试了各种方法来逃避引号,如:

-Publisher "CN=\`"Acme`, Inc.\`""

结果:

  

无法找到接受参数'Inc。'的位置参数。

此:

-Publisher 'CN="Acme, Inc."'

结果:

  

由于输入无效,Appx清单验证失败:'Publisher'无法分配值'CN = Acme,Inc。'原始错误:'异常调用“SetPackageIdentityPublisher”带有“1”参数:“针对模式验证AppxManifest.xml失败并显示错误:在XML中找到错误(0):'Publisher'属性无效 - 值'CN = Acme,Inc。'根据其数据类型“http://schemas.microsoft.com/appx/manifest/types:ST_Publisher_2010_v2”无效 - 模式约束失败。

此:

-Publisher 'CN="Acme\`, Inc."'

结果:

  

由于输入无效,Appx清单验证失败:'Publisher'无法分配值'CN = Acme`,Inc。'原始错误:'异常调用“SetPackageIdentityPublisher”带有“1”参数:“针对模式验证AppxManifest.xml失败,错误:
  在XML(0)中发现错误:'Publisher'属性无效 - 值'CN = Acme`,Inc。'根据其数据类型“http://schemas.microsoft.com/appx/manifest/types:ST_Publisher_2010_v2”无效 - 模式约束失败。

此:

-Publisher "CN=Acme, Inc."

结果:

  

由于输入无效,Appx清单验证失败:'发布者'   无法分配值'CN = Acme,Inc。'   原始错误:'异常调用“SetPackageIdentityPublisher”带有“1”参数:“针对模式验证AppxManifest.xml失败并显示错误:在XML中找到错误(0):'Publisher'属性无效 - 值'CN = Acme,Inc。'根据其数据类型“http://schemas.microsoft.com/appx/manifest/types:ST_Publisher_2010_v2”无效 - 模式约束失败。

此:

 -Publisher "CN='Acme\, Inc.'"

结果:

  

无法找到接受参数'System.Object []'的位置参数。

此:

-Publisher "CN=Acme\, Inc."

结果:

  

由于输入无效,Appx清单验证失败:'发布者'   无法分配值'CN = Acme \,Inc。'   原始错误:'异常调用“SetPackageIdentityPublisher”带有“1”参数:“针对模式验证AppxManifest.xml失败并显示错误:在XML中找到错误(0):'Publisher'属性无效 - 值'CN = Acme \,Inc。'根据其数据类型“http://schemas.microsoft.com/appx/manifest/types:ST_Publisher_2010_v2”无效 - 模式约束失败。

这很烦人,因为我们需要完美地设置发布者名称,否则签名将无法使用,因为它与我们的代码签名证书中的发布者名称不匹配。

这样做的正确方法是什么?

4 个答案:

答案 0 :(得分:0)

除双引号外,您还需要转义逗号。此外,将enire公共名称放在单引号而不是双引号中,因此您无需转义两次(对于PowerShell Active Directory)。

... -Publisher 'CN=\"Acme\, Inc.\"' ...

有关杰出名称中字符转义的详细信息,请参阅Richard L. Mueller的this article

答案 1 :(得分:0)

根据Microsoft关于appxmanifest的文档,只要发布者名称被引号(“)包围,就可以在发布者名称中包含逗号而不会出现问题:

https://msdn.microsoft.com/en-us/library/windows/apps/br211441.aspx

所以真正的问题是如何将带引号的发布者名称传递给AppConverter。

解决方案似乎是在通过这样的发布者时代表“with \”\“:

-Publisher 'CN=\"\"Company, Name\"\"'

这里的完整命令:

DesktopAppConverter.exe -Installer myInstaller.exe -InstallerArguments "/S" -Destination . -PackageName "MyApp" -Publisher 'CN=\"\"Company, Name\"\"' -Version 0.0.0.1 -MakeAppx

然而,DesktopAppConverter中似乎存在一个错误。我得到的结果是:

CN =“公司,名称

结果中缺少第二个“。我不确定为什么DesktopAppConverter无法识别第二个\”\“特殊字符,但事实就是这样,所以我们不幸被困在这里。

更新:找到解决方案。通过反复试验,我发现添加双引号“”有助于识别第二个引用。以下是有效的:

-Publisher 'CN=\"\"Company, Name""\"\"'

答案 2 :(得分:0)

不支持在桌面应用转换(DAC)的发布商参数中包含“逗号”。这是因为此值用于填充AppxManifest.xml file中Identity节点中的Publisher元素(包含在DAC生成的APPX中。

示例AppxManifest.xml文件中的测试如下:

<Identity Version="0.0.0.2" Publisher="CN=Awesome,Apps-Inc" ProcessorArchitecture="x86" Name="MyNotesFW"/>

当您尝试创建APPX文件时,您将收到此错误:

MakeAppx : error: Error info: error C00CE169: App manifest validation error: The app manifest must be valid as per schema: Line 3, Column 58, Reason: 'CN=Awesome,Apps-Inc' violates pattern constraint of '(CN|L|O|OU|E|C|S|STREET|T|G|I|SN|DC|SERIALNUMBER|Description|PostalCode|POBox|Phone|X21Address|dnQualifier|(OID\.(0|[1-9][0-9]*)(\.(0|[1-9][0-9]*))+))=(([^,+="<>#;])+|".*")(, ((CN|L|O|OU|E|C|S|STREET|T|G|I|SN|DC|SERIALNUMBER|Description|PostalCode|POBox|Phone|X21Address|dnQualifier|(OID\.(0|[1-9][0-9]*)(\.(0|[1-9][0-9]*))+))=(([^,+="<>#;])+|".*")))*'.

**The attribute 'Publisher' with value 'CN=Awesome,Apps-Inc' failed to parse.**

答案 3 :(得分:0)

以上都不适合我。 我试着围绕完整的公司名称加倍"",终于工作了!

'CN=""NAME, INC.""'

在CN之前和结束之后忘记' ""