使用Ansible win_powershell模块查询AD时的权限问题求助
使用Ansible win_powershell模块执行AD查询时遇到NTLM访问拒绝错误
问题描述
使用Ansible的ansible.windows.win_powershell模块执行AD用户查询时触发NTLM访问拒绝错误。认证环节已通过,但存在权限限制:将运行任务的服务账号设为域管理员可正常执行,但该方案不符合生产环境安全要求。已尝试将账号加入Remote Management Users、Distributed COM Users等组,并配置服务登录、本地登录、批处理作业登录权限,均未解决问题。
补充信息
- 同时使用
microsoft.ad.user模块创建用户,两个任务均通过5986端口的WinRM连接,采用NTLM认证; - 直接在目标域控制器或其他非DC机器上以该服务账号运行相同PowerShell脚本,可正常返回查询结果,推测是Ansible模块后台操作的权限限制导致问题。
错误信息
ntlm: Access is denied. (extended fault data: {'transport_message': 'Bad HTTP response returned from server. Code 500', 'http_status_code': 500, 'wsmanfault_code': 5, 'fault_code': 's:Sender', 'fault_subcode': 'w:AccessDenied'})
执行代码
- name: Check for AD user existence ansible.windows.win_powershell: script: | Import-Module ActiveDirectory -ErrorAction Stop $name = "{{ first_name | trim }}{{ last_name | trim }}" $email = "{{ email }}" $domain = "{{ domain_controller }}" Write-Output "Searching for user with name: $name in domain: $domain" try { $user = Get-ADUser -Filter "SamAccountName -like '*$name*'" -Server $domain -ErrorAction Stop Write-Output "User found: $($user.SamAccountName)" } catch { Write-Output "No user found" } register: user_checks delegate_to: "{{ domain_controller_IP }}" become: yes become_method: runas become_user: '{{ domain_username }}' ignore_errors: true #TODO: Remove this once we have a working solution vars: ansible_user: "{{ domain_username }}" ansible_password: "{{ domain_password }}" ansible_connection: winrm ansible_winrm_server_cert_validation: ignore ansible_winrm_transport: ntlm ansible_port: 5986
解决方案
1. 核心权限与用户组要求
要通过win_powershell模块在域控制器上执行AD查询,服务账号需满足以下条件:
- AD对象读取权限:确保账号对目标AD域或OU内的用户对象拥有
读取权限,可通过AD管理中心(ADAC)或Set-ADPermission命令配置; - WinRM远程访问权限:加入
Remote Management Users组,同时确认域控制器的WinRM服务已启用NTLM认证(执行winrm get winrm/config/service/auth查看配置); - 本地登录权限:在域控制器的本地安全策略中,给账号分配
允许本地登录权限(路径:本地安全策略→本地策略→用户权限分配); - DCOM远程激活权限:打开域控制器的组件服务,在「我的电脑」属性的COM安全设置中,给账号分配
远程激活权限(路径:组件服务→计算机→我的电脑→右键属性→COM安全→启动和激活权限→编辑限制)。
2. Ansible任务配置优化
- 移除冗余的
become配置:任务中同时指定ansible_user和become_user会导致双重身份验证,易引发权限冲突。建议保留ansible_user配置,删除become相关参数; - 调整WinRM传输方式:将
ansible_winrm_transport改为negotiate,部分环境下NTLM权限校验更严格,Negotiate会自动适配更兼容的认证方式; - 验证执行上下文:在PowerShell脚本中加入
whoami /groups命令,输出当前账号的组信息,确认权限组是否已正确生效。
3. 替代方案
若权限配置仍有障碍,可改用microsoft.ad.user_info模块替代自定义PowerShell脚本。该模块专为AD用户查询设计,权限需求更明确,且与microsoft.ad.user模块的权限体系一致,能减少兼容性问题。
内容的提问来源于stack exchange,提问作者Jeremy D
相关产品推荐
相关产品推荐

