gpt4 book ai didi

c# - 使用 C# 的服务上的 SACL ||使用 C# 获取具有 ACCESS_SYSTEM_SECURITY 权限的服务的句柄

转载 作者:行者123 更新时间:2023-11-30 22:50:43 27 4
gpt4 key购买 nike

有人知道如何使用 C# 在远程服务上获取 SACL 吗?我尝试了很多不同的方法,但基本上没有任何效果。我可以在本地计算机上获得 DACL 和 SACL,但在远程计算机上似乎不可能。

我所做的是创建一个名为 ServiceSecurity 的类,该类继承自 NativeObjectSecurity,其行为与 RegistrySecurity 类非常相似。以下是我拥有的两个构造函数:

public ServiceSecurity(string serviceName, AccessControlSections includeSections)
: base(true, ResourceType.Service, serviceName, includeSections, null, null)
{
}

public ServiceSecurity(System.Runtime.InteropServices.SafeHandle handle, AccessControlSections includeSections)
: base(true, ResourceType.Service, handle, includeSections)
{
}

第一个使用服务名称,而第二个需要服务的句柄。显然,第一个可以很好地获取 DACL 和 SACL,因为它都是本地的,但要访问远程计算机,我使用 ServiceController 类来查找远程计算机上的服务。获取后,我将服务的ServiceHandle属性传递给我构建的ServiceSecurity类,此时我得到一个未授权访问异常,这似乎不是正确,因为我的用户帐户是该域的域管理员,也是目标框上的本地管理员。我还有 SeSecurityPrivilege 权限,应该允许我访问。

有人有什么想法吗?看起来我得到的 SafeHandle 不对,但是 SafeHandle 属性说它没有关闭并且它是一个有效的句柄,所以我不很清楚发生了什么。

这是我用来尝试检索数据的代码:

ServiceSecurity sSec = new ServiceSecurity(services[i].ServiceName, accessSections);
string outputData = sSec.GetSecurityDescriptorSddlForm(accessSections);

以上内容适用于本地权限和审核设置(DACL 和 SACL)。但它是为在本地机器上工作而设计的。如果我改为这样做:

ServiceSecurity sSec = new ServiceSecurity(services[i].ServiceHandle, accessSections);
string outputData = sSec.GetSecurityDescriptorSddlForm(accessSections);

ServiceSecurity 构造函数在 SACL 的本地和远程服务器上均失败,如下所示,但仍然适用于 DACL:

System.UnauthorizedAccessException: Attempted to perform an unauthorized operation.
at System.Security.AccessControl.Win32.GetSecurityInfo(ResourceType resourceType, String name, SafeHandle handle, AccessControlSections accessControlSections, RawSecurityDescriptor& resultSd)
at System.Security.AccessControl.NativeObjectSecurity.CreateInternal(ResourceType resourceType, Boolean isContainer, String name, SafeHandle handle, AccessControlSections includeSections, Boolean createByName, ExceptionFromErrorCode exceptionFromErrorCode, Object exceptionContext)
at System.Security.AccessControl.NativeObjectSecurity..ctor(Boolean isContainer, ResourceType resourceType, SafeHandle handle, AccessControlSections includeSections)

对于 accessSections,我只指定了 AccessControlSections 中的一个,无论是 Audit 还是 Access,每次我传递 ServiceHandle 时,Audit 似乎都失败了>.


更新:所以也许真正的问题应该是,我如何获得具有 ACCESS_SYSTEM_SECURITY 权限的服务的句柄,以便我可以获得 SACL?

最佳答案

您从 ServiceController 获得的句柄将没有 ACCESS_SYSTEM_SECURITY 权限,因此您无法使用它访问 SACL。

为了获得该权利,您需要掌握该权利。您可能需要使用 DuplicateHandle 来获得额外的权限,但为远程系统启用 SeSecurityPrivilege 可能会很棘手。

您是否尝试过使用具有远程名称的命名服务构造函数?

我需要稍微检查一下,然后再回复您。如果明天之前没有人给出更好的答案,我会为您挖掘答案。

编辑:我所说的命名服务构造函数是指尝试使用\\server_name\service_name 或\\IP_address\service_name 形式的服务名称创建一个 ServiceSecurity 对象。理论上它应该可以工作,但它可能不会,因为 SeSecurityPrivilege 将在本地计算机而不是远程计算机上启用。

为了获得授予的 ACCESS_SYSTEM_SECURITY 权限的句柄,您必须遵循以下步骤:

  • 检索句柄(从 ServiceController 或通过互操作)
  • 为当前 token 启用 SeSecurityPrivilege(这是棘手的部分),参见:AdjustTokenPrivileges , TOKEN_PRIVILEGES , LUID_AND_ATTRIBUTES
  • 调用DuplicateHandle在句柄上请求您需要的任何权限,包括 ACCESS_SYSTEM_SECURITY 以检索具有适当权限的新句柄。
  • 禁用 SeSecurityPrivilege(如上所述)。

不幸的是,我没有设置适当的测试环境来测试它,所以我不能保证它适用于远程服务。为远程服务器启用 SeSecurityPrivilege 似乎是主要的绊脚石。不管怎样,我希望这至少能有所帮助。

关于c# - 使用 C# 的服务上的 SACL ||使用 C# 获取具有 ACCESS_SYSTEM_SECURITY 权限的服务的句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/426295/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com