1

我编写了一个程序,用户可以在其中选择本地和远程目录。在对选定路径执行任何操作之前,我想检查它是否有效以及用户是否具有对其授予的读/写权限。这就是我所拥有的:

private bool checkInput(string dirPath, string depthStr, string filename)
{
    ...
    string reason = null;
    try
    {
        ...
        else if ((reason = CAN_ACCESS(dirPath)) == null)
        {
            if (!(new DirectoryInfo(dirPath)).Exists)
                reason = string.Format("The directory '{0}' is no directory or does not exist!", dirPath);
            ...
        }
    }
    catch (Exception ex)
    {
        reason = ex.Message;
    }

    if (reason != null)
    {
        MessageBox.Show(reason, "Wrong input", MessageBoxButton.OK, MessageBoxImage.Error);
        return false;
    }
    return true;
}

public static string CAN_ACCESS(string dirPath)
{
    Uri uri = new Uri(dirPath);
    //UserFileAccessRights rights = new UserFileAccessRights(dirPath);

    string errorMsg = null;
    if (uri.IsUnc && !haveAccessPermissionOnHost(uri))
    {
        string domain = new Uri(dirPath).Host;
        domain = dirPath;
        ErrorClass res = PinvokeWindowsNetworking.connectToRemote(domain, null, null, true);
        if (res == null)
            return null;
        else
            errorMsg = string.Format("(Code {0}): {1}", res.num, res.message);
    }

    return errorMsg;
}

private static bool haveAccessPermissionOnHost(Uri uri)
{
    throw new NotImplementedException();
}

主要问题haveAccessPermissionOnHost(Uri uri),是,如果用户在远程主机上具有读/写权限并授予 unc 路径,如何简单地签入。

提示: 如果未授予权限,则会弹出众所周知的 Windows 登录窗口以强制用户输入一些凭据,这可以正常工作:

ErrorClass res = PinvokeWindowsNetworking.connectToRemote(domain, null, null, true);

我从这个问题中得到了它(并更改了提供的代码以在成功时返回ErrorClass, null )。

我的第二个问题是,如果我的结构通常是检查路径的方式,无论是本地的还是远程的,是否有效(这就是我根据需要提供更多代码的原因)。

4

1 回答 1

1

我找到了一个解决方法,因为没有人回答这个问题:

public static bool canAccess(DirectoryInfo dirInfo)
{
    Uri uri = new Uri(dirInfo.FullName);

    // is this a remote path?
    if (uri.IsUnc)
    {
        if (hostOnline(uri.Host))
        {
            // check if remote path exists
            if (!dirInfo.Exists)
            {
                string domain = dirInfo.FullName;
                ErrorClass res = PinvokeWindowsNetworking.connectToRemote(domain, null, null, true);
                if (res == null)
                {
                    if (!dirInfo.Exists)
                        throw new Exception(
                            string.Format("No access permissions or directory not existing."));
                    return true;
                }
                else if (res.num == 53)
                    throw new Exception("Remote directory not existing.");
                else
                    throw new Exception(
                        string.Format("(Code {0}): {1}", res.num, res.message));
            }
        }
        else
            throw new Exception("Unknown host or not online.");
    }

    // local directory existing?
    return dirInfo.Exists;
}

private static bool hostOnline(string hostname)
{
    Ping ping = new Ping();
    try
    {
        PingReply pr = ping.Send(hostname);
        return pr.Status == IPStatus.Success;
    }
    catch (Exception)
    {
        return false;
    }
}
于 2013-09-26T07:57:35.783 回答