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 に答える