Доступ к файлу в сети с пользователем за пределами домена - PullRequest
0 голосов
/ 20 января 2020

Мне нужен доступ к файлу с сетевого диска с пользователем, который может отсутствовать в домене.

Мой текущий код:

private async Task GetUxVersionsFromServer()
{            

    string path = @$"\\{IpAddress}\...\...\...";

    if(!await GetFiles(path))
    {
        using (UNCAccessWithCredentials unc = new UNCAccessWithCredentials())
        {
            bool retry = true;
            do
            {
                (var ok, var username, var password) = _dialogService.ShowPasswordInput();

                if (ok)
                {
                    if (unc.NetUseWithCredentials(path, username, "domain", password))
                    {
                        await GetFiles(path);
                        retry = false;
                    }
                }
                else
                {
                    retry = false;
                }

            } while (retry);
        }
    }

}

private async Task<bool> GetFiles(string path)
{
    try
    {
        var zipFiles = await Task.FromResult(System.IO.Directory.GetFiles(path, "VERSION*.zip"));
        Versions = new ObservableCollection<string>(zipFiles);

        return true;
    }
    catch (IOException)
    {
        return false;
    }
}

Я использую класс UNCAccessWithCredential из здесь

Работает нормально.

Если пользователь имеет доступ к каталогу, ввод пароля не должен отображаться. Единственная проблема заключается в том, что я не могу проверить, есть ли у пользователя Windows доступ к каталогу, без перехвата исключения.

Можно ли сделать запрос, если вошедший в систему пользователь Windows имеет доступ к сетевому каталогу или нет?

Есть ли способ запроса, если вошедший в систему пользователь Windows находится в домене?

Ответы [ 2 ]

0 голосов
/ 22 января 2020

Наконец я решил это так:

    private async Task GetUxVersionsFromServer()
    {

        string path = @$"\\{server}\...";


        if (Environment.UserDomainName.ToLower() != "myDomain")
        {
            bool success = false;
            bool ok;
            do
            {                    
                (bool result, var username, var password) = _dialogService.ShowPasswordInput();
                ok = result;
                if (ok)
                {
                    try
                    {
                        using (new NetworkConnection(path, new NetworkCredential($@"myDomain\{username}", password)))
                        {
                            success = await GetFiles(path);                                
                        }
                    }
                    catch (System.ComponentModel.Win32Exception ex)
                    {
                        success = false;
                    }

                } 
            } while (!success && ok);

            if(!ok)
            {
                int test = 0;
            }
        }
        else
        {
            await GetFiles(path);
        }

    }

Я взял класс NetworkConnection с здесь

0 голосов
/ 20 января 2020

Множество способов выяснить права доступа к каталогу здесь: Как проверить права на запись в каталог или файл?

Что касается членства в домене, используйте это: https://docs.microsoft.com/en-us/dotnet/api/system.environment.userdomainname?view=netframework-4.8

Свойство UserDomainName сначала пытается получить компонент имени домена для учетной записи Windows для текущего пользователя. Если эта попытка не удалась, это свойство пытается получить имя домена, связанное с именем пользователя, предоставленным свойством UserName. Если эта попытка не удалась из-за того, что хост-компьютер не присоединен к домену, возвращается имя хост-компьютера.

...