【问题标题】:Ansible to SUBST a drive machine-wideAnsible SUBST 驱动机器范围
【发布时间】:2020-10-20 19:05:37
【问题描述】:

我已将 Ansible 设置为使用 WinRM 证书方法连接到 Windows Server 2019。我需要将 D 驱动器映射为简单地镜像 C。使用 SUBST 我可以做 SUBST D: C:\ 但是...

  • 当我使用 win_shell 使用 Ansible 运行命令时,远程桌面不显示驱动器。
  • 反之亦然:当我使用远程桌面运行命令时,Ansible 的 shell 看不到新的 D 盘。
  • 我尝试使用registry tricks 使映射保持不变,重新启动后,我可以在远程桌面的文件资源管理器中看到驱动器,但 PowerShell 和 Ansible 的 win_shell 都看不到它。

如何使用 Ansible playbook 在机器范围内将 C 映射到 D?

【问题讨论】:

  • 当您在“HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\DOS 设备”中定义“D:”驱动器链接时,您是针对卷设备“\??\C:”还是根目录 "\??\C:\"?它应该是最大兼容性的音量设备; subst.exe 不能这样做。为了增加措施,我还将其设为明确的全局设备路径,例如"\GLOBAL??\C:".
  • 但是请记住,这不是在挂载点管理器中注册的规范驱动器,因此GetFinalPathNameByHandleW 等 API 函数仍将解析为“C:”驱动器。
  • @ErykSun 我错过了 `\??` 前缀。感谢您提供有用的 cmets。

标签: windows powershell ansible subst


【解决方案1】:

我不知道你为什么要这样做,但你可以尝试使用工作站服务:

Net use d: \\localhost\c$

您可能遇到的一个问题是该命令必须由使用它的同一用户运行,例如,如果您在提升的管理员 shell 中运行它,您将不会在简单的用户 shell 中看到它。

【讨论】:

  • 谢谢。这不能完全满足我正在使用的遗留系统的需求,但它可能对访问此页面的人很有用。
【解决方案2】:

驱动器的注册表值缺少\??\ 前缀。使用正确的注册表值,一切正常。作为记录,这是我最终完成的 ansible 任务:

    - name: Map D drive to C.
      ansible.windows.win_regedit:
        path: HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\DOS Devices
        name: "D:"
        state: present
        type: string
        data: '\??\C:'

【讨论】:

  • 目标 "\??\C:" 或 "\Global??\C:" 以获得最佳结果,而不是根目录 "\??\C:\"。如果驱动器实际上是目录而不是设备,则某些 API 函数会出现错误——例如GetVolumePathNameW 对 subst.exe 驱动器表现不佳,因为它们以目录为目标。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多