我们正在尝试使用Chef为客户端提供管理Windows 2012服务器的解决方案,但遗憾的是,Chef-client运行失败并出现Chef::Exceptions::WindowsNotAdmin: can not get the security information for <some_file> due to missing Administrator privileges
异常。
这有点奇怪,因为我们已经确认我们用于远程管理服务器的域帐户是Administrators组的成员。我们能够使用它来管理同一域内的其他服务器。此外,当我们通过远程桌面使用域帐户连接到服务器时,以管理员身份启动PowerShell并启动了厨师 - 客户端运行,它失败并出现相同的异常。
运行以下命令会显示域帐户确实是Administrators组的成员。这可以通过该组的SID
进行验证。
Get-WmiObject -Class Win32_UserAccount
Get-WmiObject -Class Win32_Group
[System.Security.Principal.WindowsIdentity]::GetCurrent().Groups
不确定服务器上的哪些设置可能导致此问题。
答案 0 :(得分:3)
通过此thread提供的见解,进一步深入了解Chef的代码,发现win32函数GetNamedSecurityInfoW被调用here来确定对象的安全信息(文件,文件夹)等等。)。这在烹饪安装期间发生,其中需要在端点服务器上创建一些资源文件或宝石。
首先将创建一个空文件,之后如果是一个选项,文件内容将以原子方式更新。在文件内容更新期间,需要通过函数GetNamedSecurityInfoW检查文件的安全访问控制列表。要调用此函数,登录用户需要具有SE_SECURITY_NAME权限。 Chef本身也尝试通过在调用函数之前添加此权限并在函数调用之后将其还原来处理此问题,但这并不总能保证。系统设置似乎占上风。
我们稍微破解了Chef代码以尝试在GetNamedSecurityInfoW上打印出函数调用的输出,并且它是状态代码1314
,表示用户不持有所需的权限。
我们尝试在服务器上运行whoami /priv
,发现列表中找不到SeSecurityPrivilege
权限。下面只是普通Windows服务器上的示例输出。
Privilege Name Description State
========================================================================
SeLockMemoryPrivilege Lock pages in memory Disabled
SeIncreaseQuotaPrivilege Adjust memory quotas for a process Disabled
SeSecurityPrivilege Manage auditing and security log Disabled
...
请注意,state列仅指示用户是否正在使用权限。它的存在表明用户是否拥有它。
将此权限添加回域帐户后,即在Manage auditing and security log
编辑器中将Administrators
的安全设置设置为Local Securtiy Policy
组,然后重新启动服务器,Chef-client run成为成功的。
似乎Chef大量使用win32 API函数来管理Windows节点。这些API函数似乎需要各种权限才能运行。有点奇怪的是,Chef拯救了所有win32 API错误,并将Chef::Exceptions::WindowsNotAdmin
传播到chef-client运行日志,如here所示。实际解析错误并提供一些更有用的信息会很好。