Puppet 无法在 C:\windows\system32 文件夹中创建文件

Puppet is not able to create files in C:\windows\system32 folder

我正在尝试创建一个 .ssh 文件夹,然后将 id_rsa 和 known_hosts 文件添加到 windows 2016 服务器的 .ssh 文件夹中。此文件夹需要进入任何手动(或作为服务)运行s puppet 的用户。为了完成这项工作,我编写了一个自定义事实 $::user_profile_directory 来表示主目录 (%userprofile%)。该方法对所有用户都完全适用,除非 puppet 运行s 作为服务。

当 puppet 运行s 作为服务时,它会在 "c:/windows/system32/config/systemprofile" 文件夹中创建 .ssh 文件夹,但不会在创建的 .ssh 文件夹中创建文件(id_rsa 文件known_hosts 文件)。如果 运行 puppet 服务与任何其他用户一样,则不会发生这种情况。

Puppet 也没有在日志中显示任何错误,而是说内容已更改为特定的 md5 和哈希。但是如果我使用资源管理器手动检查,.ssh 文件夹不包含任何文件。

此外,如果我手动将文件放入 c:/windows/system32/config/systemprofile/.ssh 文件夹,它会更正文件的权限。我不明白,如果它能够更正文件的权限(如果存在),那么为什么它无法创建文件。 这是我的简单木偶代码:

$user_home = $::user_profile_directory

  file { "${user_home}/.ssh":
    ensure => 'directory',
    #owner  => $user_name,
    group  => 'Administrators',
    mode   => '0700'
  } ->

  file { "${user_home}/.ssh/id_rsa":
    ensure  => 'file',
    content => hiera('vester::vester_private_key'),
    #owner   => $user_name,
    group   => 'Administrators',
    mode    => '0600'
  } ->

  file { "${user_home}/.ssh/known_hosts":
    ensure             => 'file',
    source             => 'puppet:///modules/vester/known_hosts',
    source_permissions => 'ignore',
    #owner              => $user_name,
    #group              => 'Administrators',
    #mode               => '0660'
  }

当人偶 运行 作为服务时: ${user_home} 是 c:/windows/system32/config/systemprofile

当 puppet 运行s 作为其他用户时(假设是 vagrant): ${user_home} 是 c:/users/vagrant

生成 $::user_home 事实的因子代码:

Facter.add('user_profile_directory') do
  confine :osfamily => :windows
  setcode do
    ENV['USERPROFILE']
  end
end

编辑 1: 刚刚发现,我可以创建文件夹,但无法在 "C:/windows/system32" 下的任何 folders/subfolders 中创建文件。如何使用 puppet 在 system32 下的自定义文件夹中创建文件?

编辑 2: 刚刚想到,即使 $::user_profile_directory 正在返回

c:/windows/system32/config/systemprofile

我的所有文件都放在

c:/windows/syswow64/config/systemprofile

Puppet 32​​ 位客户端安装在我的 64 位 Windows 2016 服务器上。 文件实际上正在创建,但不是

c:/windows/system32/config/systemprofile/.ssh

文件是在

中创建的

c:/windows/syswow64/config/systemprofile/.ssh

我的人偶客户端的文件夹。

%windir%\System32 目录是为 64 位 Windows 上的 64 位应用程序保留的。大多数 DLL 文件名在创建 64 位版本的 DLL 时没有更改,因此 32 位版本的 DLL 存储在不同的目录中。 WOW64 通过使用文件系统重定向器隐藏了这种差异。

在大多数情况下,每当 32 位应用程序尝试访问 %windir%\System32%windir%\lastgood\system32 或 `%windir%\regedit.exe 时,访问将被重定向到架构-具体路径。

奇怪的是,尽管文件是在 c:/windows/syswow64/config/systemprofile/.ssh 文件夹中创建的,但事件查看器中的 puppet 日志显示文件已在 c:/windows/system32/config/systemprofile/.ssh 中成功创建。发生这种情况是因为 puppet 32​​ 位客户端不知道 windows.

中的秘密重定向

我的解决方法是删除 32 位 puppet 客户端并安装回 64 位 puppet 客户端,因为我的一个 puppet-modules(puppetlabs/vsrepo) 试图从 c:/windows/system32/config/systemprofile/.ssh 文件夹,因为它在后台使用 64 位 git.exe 客户端。

More about the WOW64 secret redirection in Microsoft documentation here