windows - Chef::Exceptions::WindowsNotAdmin:由于缺少管理员权限,无法获取安全信息

标签 windows powershell chef-infra

我们试图提供一个解决方案来使用 Chef 为客户端管理 Windows 2012 服务器,但不幸的是,chef-client 运行失败,并显示 Chef::Exceptions::WindowsNotAdmin: can not get the security information for <some_file> due to missing Administrator privileges异常(exception)。

这有点奇怪,因为我们已经确认用于远程管理服务器的域帐户是管理员组的成员。我们能够使用它来管理同一域内的其他服务器。此外,当我们通过远程桌面使用域帐户连接到服务器,以管理员身份启动 PowerShell 并启动 Chef 客户端运行时,它失败并出现同样的异常。

运行以下命令表明该域帐户确实是管理员组的成员。这可以通过 SID 来验证团体的。

Get-WmiObject -Class Win32_UserAccount
Get-WmiObject -Class Win32_Group
[System.Security.Principal.WindowsIdentity]::GetCurrent().Groups

不确定服务器上的哪些设置可能导致此问题。

最佳答案

根据此 thread 提供的见解,进一步挖掘 Chef 的代码发现一个 win32 函数 GetNamedSecurityInfoW被调用here确定对象(文件、文件夹等)的安全信息。这种情况发生在说明书安装期间,需要在端点服务器上创建一些资源文件或 gem。

首先将创建一个空文件,然后如果可以的话,文件内容将自动更新。文件内容更新时,需要通过函数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
...

请注意,状态列仅指示用户是否正在使用权限。它的存在表明用户是否拥有它。

将此权限添加回域帐户后,即将管理审核和安全日志的安全设置设置为本地安全策略Administrators 编辑器,并重新启动服务器,chef-client 运行成功。

Chef 似乎大量使用 win32 API 函数来管理 Windows 节点。而且这些API函数似乎需要各种权限才能运行。有点奇怪的是,Chef 拯救了所有 win32 API 错误,只是将 Chef::Exceptions::WindowsNotAdmin 传播到 Chef-client 运行日志,如 here 所示。 。最好实际解析一下错误并提供一些更有用的信息。

关于windows - Chef::Exceptions::WindowsNotAdmin:由于缺少管理员权限,无法获取安全信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42974145/

相关文章:

java - 应用程序服务器可能已经在主机 localhost 上运行

windows - Robocopy:/move 参数无法正常工作

powershell - 从 PSSession 内的 New-PSDrive 复制项目

maven - 覆盖 Vagrantfile 自定义 JSON 数据中的 Cookbook 属性

ruby - 列出 Chef 中所有声明的包

windows - 卸载Npgsql 3.1.6

c# - 将字符串列表作为参数传递给控制台应用程序

powershell - 在 Azure 中运行 PowerShell 脚本作为任务计划程序,无需创建任何虚拟机

command-line - 设置PowerShell脚本以自动执行

chef-infra - 设置独特 Chef 节点属性的最佳实践