使用非管理员用户进行WebDeploy时出现401未经授权的错误

14

<TLDR>
是否可能使用ms web deploy在命令行中使用非管理员用户将Web应用程序部署到远程主机?
</TLDR>

我已经按照微软的安装和配置Web Deploy指南中的每个步骤进行了操作。我的目标是能够使用IIS用户/非管理员用户进行远程Web部署。

在按照为非管理员部署安装和配置Web Deploy描述的所有步骤后,我收到以下日志消息(表示一切正常):

Publish enabled for 'deploy_user'
Granted 'deploy_user' full control on 'C:\inetpub\wwwroot'
Successfully created settings file 'C:\Users\...\Desktop\deploy_user_Default Web Site.PublishSettings'

接下来,当我尝试在本地计算机上运行以下命令时:
.\my_deploy_package.cmd /M:https://machine_name:8172/msdeploy.axd -allowUntrusted /U:deploy_user /P:deploy_password /A:Basic /T

我收到一个错误消息,内容为:Error: 远程服务器返回了一个错误:(401) 未经授权。 如果我在目标机器上进入事件查看器>自定义视图>管理员事件,我会看到一个带有以下消息的“匹配”错误:

IISWMSVC_AUTHORIZATION_SERVER_NOT_ALLOWED

只有Windows管理员可以使用服务器连接进行连接。其他用户应使用“连接到站点或应用程序”任务才能连接。

进程:WMSvc 用户=deploy_user

这个错误与此问题中描述的完全相同。已接受的答案建议我已经采取的方法是正确的。
我尝试了几种提供的解决方法,例如 this,但似乎没有什么帮助。管理服务设置为允许远程连接(包括Windows和IIS管理器),我已经为内置Windows用户(非管理员)和IIS管理器用户运行了配置,但仍然出现相同的错误。但是,只要我使用管理员用户运行部署命令,它就成功了。
我可以通过我的非管理员deploy_user用户通过IIS gui进行远程连接(在IIS中:连接到站点 > [服务器url]/[站点名称] > deploy_user/deploy_password),表明必要的权限和规则已经配置好了。然而,当我尝试使用相同的用户运行部署脚本命令时,它会失败。
如果错误信息所示的确实是这样,即任何非管理员用户只能通过IIS Manager使用“连接到站点或应用程序”,那么从命令行/构建服务器进行部署的推荐方法是什么?我真的不想在构建服务器的配置中明文输入管理员用户的用户名/密码...
我发现的一个可行的选择是,如果您的构建服务器和您尝试部署到的机器有一个共同的Active Directory(或其他共享用户的方式),则可以跳过/A:Basic标志并完全省略用户名和密码。您必须确保运行部署的用户也具有部署目标上的管理员权限。但是,在我们的一个案例中,构建服务器和部署目标没有共同的用户基础,因此这不是一个选项,我们又回到了明文输入用户名/密码的问题 - 这一点都不理想。

也许这可以帮助?https://dev59.com/2XE85IYBdhLWcg3wOw_s - Elad Lachmi
@EladLachmi:你在链接中提到的建议正是我所做的(请参见我的问题中第三段之后的输出_"在按照描述执行所有步骤之后..."_)。 - Julian
现在我明白了。对不起。 - Elad Lachmi
你可以尝试在 https://machine_name:8172/msdeploy.axd 后面添加站点名称吗?例如:https://machine_name:8172/msdeploy.axd?site=[MySiteName] - Elad Lachmi
@EladLachmi:哦,天啊,它真的起作用了!我从来没有想过在机器参数中指定站点名称——因为它已经在参数文件中指定了,并且我也记不得在任何示例中看到过它。将其发布为答案,我会接受并奖励你赏金! - Julian
很高兴能帮到你!已添加回答。谢谢。 - Elad Lachmi
4个回答

23

由于用户仅在站点级别而非IIS根级别拥有管理员权限,因此需要添加站点名称。

您需要将https://machine_name:8172/msdeploy.axd替换为https://machine_name:8172/msdeploy.axd?site=[MySiteName]

如果没有添加该参数,msdeploy会尝试通过IIS的根访问站点。添加了该参数后,可以直接访问站点,并且特定网站上的管理员权限就足够了。


具体来说,去掉方括号'['和']'。这样更加清晰易懂。 - Sebastian 506563
此外,请确保在用户名字段中包含用户的机器名称。 - Bart Verkoeijen
1
在使用VS2017发布时遇到了相同的问题。是否可以让Visual Studio指定站点呢? - ArieKanarie

6

尝试直接从命令行运行此命令

msdeploy.exe
  -source:package='…\DemoProject.zip'
  -dest:auto,
        computerName='https://TESTWEB1:8172/MSDeploy.axd?site=DemoSite',
        userName='FABRIKAM\User',
        password='Pa$$w0rd',
        authtype='Basic'
  -verb:sync
  -setParamFile:"…\DemoProject.SetParameters.xml"  
  -allowUntrusted

DemoProject.zip 替换为您的包名,TESTWEB1 替换为您的服务器名。同时根据需要更改 username, password, DemoSiteDemoProject.SetParameters.xml

引用自这里


这个命令与运行_my_deploy_package.cmd_脚本时发出的命令几乎完全相同,因此没有任何区别。 - Julian

2

这篇文章对我帮助很大,有两个点特别值得注意:

  1. 指定网站名称
  2. 将身份验证类型设置为基本类型。

我的 Web 应用程序名称中包含空格,当我尝试像这样指定服务 URL 时,一直出现错误:https://machine_name:8172/msdeploy.axd?site=my%20web%20app

我通过使用附加的 msdeploy.exe 标志"-setParam:name='IIS Web Application Name',value='my web app'"来设置站点名称,成功解决了问题。

我的工作命令是:

my_deploy_package.cmd /M:https://machine_name:8172/msdeploy.axd /U:deploy_user /P:deploy_password /A:basic -allowUntrusted "-setParam:name='IIS Web Application Name',value='my web app'"


是的,明确指定认证方法对我帮助很大,但我还发现有必要将用户名与域名一起写入,例如:/U:domain\username。 - undefined

2
假设您没有使用MSI进行安装,并且已经正确安装和配置了以下步骤,请确保WMSvc在服务器上正确配置。请查看以下答案是否对此有帮助:https://dev59.com/A2445IYBdhLWcg3wiq8i#4834248 2.如果未安装Web Management Service,则MSI不会安装Web Management Service处理程序组件;该处理程序组件对于非管理员部署是必需的。为启用处理程序组件的安装,应首先安装Windows组件IIS,包括管理服务。
3.如果未安装PowerShell v2,则MSI不会配置Web Management Service以允许非管理员部署。此设置步骤包括在IIS服务器Administration.config文件中创建委派规则,以允许非管理员用户使用Web Deploy。PowerShell v2内置于Windows Server 2008 R2中,但可能需要对Windows Server 2008进行Windows更新。或者安装后可以手动添加委派规则

一切都是使用Web平台安装程序安装的。WMSvc已经放置并且似乎配置正确。我按照教程中所示的所有步骤(http://www.iis.net/learn/install/installing-publishing-technologies/installing-and-configuring-web-deploy)设置了委派规则等,以允许非管理员部署。当我通过远程IIS连接进行非管理员部署时 _可以正常工作_(再次表明所有访问权限都已正确配置),但是从命令行执行时失败。 - Julian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接