gpt4 book ai didi

c# - 如何从 C# 中的打印机删除访问控制条目?

转载 作者:可可西里 更新时间:2023-11-01 09:34:22 25 4
gpt4 key购买 nike

我一直在尝试使用 WMI 从与 Windows 7 中的本地打印机关联的自由访问控制列表 (DACL) 中删除访问控制条目 (ACE)。代码获取安全描述符,并遍历所有DACL 中的 ACE。除非 ALE 中的受托人名为“Everyone”,否则 ACE 将添加到临时列表中。

临时列表变成数组,并替换安全描述符的 DACL 属性。然后代码使用修改后的描述符调用 SetSecurityDescriptor()。

返回值为 0x8007051B,其中 0x051B 是 Win32 错误代码:1307,不能将此安全 ID 分配为此对象的所有者。

错误消息有点令人困惑,因为我(有意)在代码中的任何地方都没有更改打印机的所有者。

如果我更改方法以将每个 ACE 都包含在临时列表中,则对 SetSecurityDescriptor() 的调用将成功完成。

以管理员身份运行应用程序没有任何区别。

当然还有代码:

    private void ChangeSecurity()
{
var query = String.Format("SELECT * from Win32_Printer where Name like \"%{0}%\"", PrinterName);
var searcher = new ManagementObjectSearcher(query);
var searchResults = searcher.Get();

foreach (ManagementObject printer in searchResults)
{
var result = printer.InvokeMethod("GetSecurityDescriptor", null, null);
var descriptor = (ManagementBaseObject)result["Descriptor"];
var flags = (uint)descriptor["ControlFlags"];
if ((flags & (uint)ControlFlags.DiscretionaryAclPresent) == (uint)ControlFlags.DiscretionaryAclPresent)
{
Console.WriteLine("DACL present");
var dacl = (ManagementBaseObject[])descriptor["DACL"];
var newDaclList = new List<ManagementBaseObject>();
foreach (var ace in dacl)
{
var trustee = (ManagementBaseObject)ace["Trustee"];
var aceType = (uint)ace["AceType"];
if ((aceType & (uint) AceType.AccessAllowed) == (uint) AceType.AccessAllowed)
{
Console.WriteLine("{0}\\{1}", trustee["Domain"], trustee["Name"]);
Console.WriteLine("Access mask {0}", ace["AccessMask"]);
if (trustee["Name"].ToString() == "Everyone" && trustee["Domain"] == null)
{
Console.WriteLine("Remove access");
}
else
{
newDaclList.Add(ace);
}
}
}

descriptor.SetPropertyValue("DACL", newDaclList.ToArray());

var inParams = printer.GetMethodParameters("SetSecurityDescriptor");
inParams["Descriptor"] = descriptor;
result = printer.InvokeMethod("SetSecurityDescriptor", inParams, null);
Console.WriteLine("Result code: {0}", result["ReturnValue"]);
}
}

最佳答案

我遇到了同样的问题。我想从非管理员帐户和组中删除对打印机的访问权限。

解决方法是:

替换这一行:

descriptor.SetPropertyValue("DACL", newDaclList.ToArray());

用这个:

descriptor.SetPropertyValue("DACL", newDaclList.ToArray());
descriptor.SetPropertyValue("Group", null);
descriptor.SetPropertyValue("Owner", null);
descriptor.SetPropertyValue("ControlFlags", (uint)ControlFlags.DiscretionaryAclPresent);

我花了好几个小时才弄明白。

请参阅 Microsoft 文档中的“备注”部分:

https://msdn.microsoft.com/en-us/library/aa393594(v=vs.85).aspx

关于c# - 如何从 C# 中的打印机删除访问控制条目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18198732/

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