我正在尝试检查一个服务是否具有对特定本地目录的访问权限:
public static bool HasDirectoryPermissions(String path,fileSystemRights rights,String servicename) { try { var directoryAccessControl = Directory.GetAccessControl(path); ManagementObjectSearcher query = new ManagementObjectSearcher("SELECT * FROM Win32_Service where name='" + servicename + "'"); var queryResults = (from ManagementObject x in query.Get() select x); if (queryResults.Count() > 0) { var serviceUser = (string)queryResults.FirstOrDefault().PropertIEs["Startname"].Value; var serviceUserAccount = new NTAccount(serviceUser); var rules = directoryAccessControl.GetAccessRules(true,true,typeof(NTAccount)); foreach (var rule in rules) { if (rule.GetType() == typeof(fileSystemAccessRule)) { var accessRule = (fileSystemAccessRule)rule; if (accessRule.IDentityReference == serviceUserAccount && (accessRule.fileSystemRights & rights) == rights && accessRule.AccessControlType == AccessControlType.Allow) { Console.Writeline("The {0} service has permissions to {1}.",servicename,path); return true; } } } Console.Writeline("The {0} service does not have directory permissions for {1}.",path); return false; } else { Console.Writeline("Could not get directory permissions for {0} because the {1} service is not installed.",path,servicename); return false; } } catch (Exception exception) { Console.Writeline("Directory permissions Could not be obtained for the {0} service against {1}. {2}",exception.ToString()); return false; } }
但是,问题是accessRule.IDentityReference == serviceUserAccount永远不是真的,因为一方面,我有一个NTAccounttypes的IDentityReference,他的名字是NT AUTHORITYNETWORK SERVICE ,而我计算的serviceUserAccount对象是NT AUTHORITYNetworkService 。 虽然这两个是相同的帐户,但是由于这些string不完全匹配,所以平等testing失败。 如何正确地testing两个NTAccount对象是否相同,尽pipe它们的语法稍有不同?
Wpf绝对与相对包装URI
从PathToolongException中检索path信息
为什么在windows7(.net 3.5)中运行的应用程序在Win8(.net4.5)中不起作用
我怎样才能得到在C#中共同的桌面和开始菜单目录的path?
MMC证书在哪里pipe理“服务帐户”的导入证书?
我刚刚尝试过的一个解决方案是将每个帐户转换为各自的SecurityIDentifIEr,然后进行比较:
accessRule.IDentityReference.Translate(typeof(SecurityIDentifIEr)) == serviceUserAccount.Translate(typeof(SecurityIDentifIEr))
PS:并不是所有的IDentityReference对象都可以转换成SID,所以一定要把它包装在try-catch块中。
总结以上是内存溢出为你收集整理的检查两个NTAccount对象的相等性全部内容,希望文章能够帮你解决检查两个NTAccount对象的相等性所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)