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

如何从C#中的打印机中删除访问控制条目?,第1张

概述如何从C#中的打印机中删除访问控制条目

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

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

返回值是0x8007051B,0x051B是Win32错误代码: 1307,此安全ID可能不会被指定为此对象的所有者。

这个错误信息有点令人困惑,因为我无意(有意)更改打印机的所有者。

为什么Process.MainWindowTitle总是空的,除了一个窗口?

如何查看当前用户的计划任务列表

机器启动时运行exe

如何读取和写入windows“networking位置”

连接到sql Server 2008 R2 Express时出错

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

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

而且,当然,代码:

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"]); } }

windows:列出并启动与扩展名关联的应用程序

用C#和远程桌面问题捕获屏幕

点击文本字段时,自动启动windows tablet中的键盘

如何在.net中获得可用的无线接入点及其信号强度?

确定windowsIDentity实例的嵌套组

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

解决方案是:

替换这一行:

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#中的打印机中删除访问控制条目?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1289073.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存