【问题标题】:Querying access to a UNC path on a remote machine via WMI通过 WMI 查询对远程计算机上 UNC 路径的访问
【发布时间】:2014-06-18 19:29:54
【问题描述】:

我想知道远程主机是否有网络共享的读写权限。一开始我想看看我是否可以查询目标主机查询 UNC 路径以获取信息的能力,ala

var query = string.Format("select * from CIM_Directory where name = '{0}'", path);

这适用于本地文件,例如

var path = @"c:\\Windows";

但是,我无法找到查询 UNC 路径(例如 \\foo\bar)的适当方法。该查询始终返回一个空白集。我看到了一个有关执行远程文件的相关问题,该问题的解决方案最终是 PsExec。我希望完全使用 WMI 来理想地解决这个问题,而不必依赖第 3 方执行人员,或者将我自己的工具上传到远程主机。

干杯

这是我现在正在尝试做的一些使用示例(已取出 var 值):

using System;
using System.Linq;
using System.Management;

namespace netie
{
    class Program
    {
        static void Main()
        {
            var connection = new ConnectionOptions
            {
                Username = "user",
                Password = "pass",
                Authority = "domain",
                Impersonation = ImpersonationLevel.Impersonate,
                EnablePrivileges = true
            };

            var scope = new ManagementScope("\\\\remote\\root\\CIMV2", connection);
            scope.Connect();

            var path = @"\\\\foo\\bar\\";
            var queryString = string.Format("select * from CIM_Directory where name = '{0}'", path);
            try
            {
                var query = new ObjectQuery(queryString);
                var searcher = new ManagementObjectSearcher(scope, query);

                foreach (var queryObj in searcher.Get().Cast<ManagementObject>())
                {
                    Console.WriteLine("Number of properties: {0}", queryObj.Properties.Count);
                    foreach (var prop in queryObj.Properties)
                    {
                        Console.WriteLine("{0}: {1}", prop.Name, prop.Value);
                    }
                    Console.WriteLine();
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
            Console.ReadLine();
        }
    }
}

【问题讨论】:

  • 对共享的访问不受客户端主机控制。共享权限和 Windows 文件系统 ACL 是按用户帐户设置的,因此您的问题没有任何意义。您可以询问特定用户帐户是否有权访问给定共享。
  • 这正是我想要做的。我需要验证在给定主机上具有给定凭据集的用户是否可以访问 UNC 路径。

标签: c# wmi unc wql


【解决方案1】:

所以看起来这基本上是不可能的,因为 WMI 出于安全原因将您锁定在网络访问之外。看起来你最好的选择是一次性使用 WinRM 或 PsExec。如果这是您唯一的访问路径,您可以通过 WMI 启用 WinRM,但我想该功能可能会被组策略阻止。第三种选择是编写您自己的 Windows 服务,该服务将响应请求并在您有权访问的情况下通过 WMI 安装它。

简而言之:我的问题的答案是否定的。使用 WinRm、PsExec 或自定义 win-service 解决方案。

【讨论】:

    【解决方案2】:

    我知道这是一个老问题,但对于任何想要这样做的人来说,以下代码都有效。 (我知道这不是 WMI。鉴于 OP 的回答,我什至没有尝试使用 WMI,但我不禁想到人们可能会为这样的事情编写服务。)

    if (System.IO.Directory.Exists(@"[SOME UNC PATH]"))
    {
        System.IO.DirectoryInfo info = new System.IO.DirectoryInfo(@"[SOME UNC PATH]");
        var securityInfo = info.GetAccessControl();
        var rules = securityInfo.GetAccessRules(
                       true, 
                       true,
                       typeof(System.Security.Principal.SecurityIdentifier));
    
        foreach (var rule in rules)
        {
            var fileSystemRule = rule as System.Security.AccessControl.FileSystemAccessRule;
            if (ruleastype != null)
            {
                string user = fileSystemRule.IdentityReference.Translate(
                        typeof(System.Security.Principal.NTAccount)).Value;
    
                System.Diagnostics.Debug.Print("{0} User: {1} Permissions: {2}",
                    fileSystemRule.AccessControlType.ToString(),
                    user,
                    fileSystemRule.FileSystemRights.ToString());
            }
        }
    }
    

    运行时会产生以下输出:

    Allow User: Everyone Permissions: ReadAndExecute, Synchronize
    Allow User: CREATOR OWNER Permissions: FullControl
    Allow User: NT AUTHORITY\SYSTEM Permissions: FullControl
    Allow User: BUILTIN\Administrators Permissions: FullControl
    Allow User: BUILTIN\Users Permissions: ReadAndExecute, Synchronize
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-25
      • 2011-01-04
      相关资源
      最近更新 更多