任何人都知道如何使用 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
.
更新:所以也许问题真的应该是,我如何获得ACCESS_SYSTEM_SECURITY
有权获得 SACL 的服务的句柄?