我一直试图使用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#中的打印机中删除访问控制条目?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)