You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 00:06:02