Nano Hash - криптовалюты, майнинг, программирование

File.Create Network Share Другие учетные данные Перезапись

Я пишу приложение для Windows, используя С#. У меня есть требование, чтобы файлы, загруженные в форму Windows, сохранялись в сетевом ресурсе, но не все пользователи могут получить доступ к сетевому ресурсу (\\FileServer\SharedFolder). Только один пользователь ( FileWriter) имеет права на чтение/запись/выполнение в этой папке. Текущий пользователь EmployeeUser не имеет разрешений на этот общий ресурс. Я проверил это, открыв Пуск->Выполнить \\FileServer\SharedFolder. Это дает окно ошибки «Отказано в доступе».

Я использовал этот пример из Опубликуйте SO, используя WNetAddConnection2 для подключения с другими учетными данными FileWriter, чтобы сохранить файл Sample.txt с помощью File.Create. До сих пор все было в порядке. WNetCancelConnection2 вызывается, я проверил в отладке кода, и программа вышла. Теперь от текущего пользователя я открыл StartMenu --> Run и набрал \\FileServer\SharedFolder, и общий ресурс сразу же открылся, хотя пользователь Windows СотрудникПользователь. Я закрыл проводник и через несколько минут (это значение меняется случайным образом при попытках) я открыл Пуск->Выполнить \\FileServer\SharedFolder. Теперь выдает ошибку "Отказано в доступе".

Я не могу этого понять. Мы очень ценим любую помощь в этом.

Теперь, после появления окна «Отказано в доступе», я снова запускаю программу с теми же шагами, за исключением того, что Sample.txt (используя File.Create) автоматически перезаписывается. Разве он не должен выдавать ошибку «Файл существует»?


  • Какое значение возвращает WNetCancelConnection2 при вызове? 19.11.2015
  • В документации для File.Create говорится, что если указанный файл не существует, он создан; если он существует и не доступен только для чтения, его содержимое перезаписывается. 19.11.2015
  • @stuartd WNetCancelConnection2 возвращает 0. Также спасибо за File.Create. Я совершенно забыл об этом. 20.11.2015

Ответы:


1

Вместо этого вы можете использовать олицетворение:

using (var impersonator = new Impersonator(username, password))
{
    File.Copy(source, destination, true);
}

это копия прошлого из нашей реализации, поэтому, пожалуйста, измените свое доменное имя

using System;
using System.Runtime.InteropServices;
using System.Security.Principal;

public class Impersonator : IDisposable
{
/// <summary>
///     The Impersonator class is used to access a network share with other credentials.
/// </summary>
private readonly WindowsImpersonationContext _impersonatedUser;

private readonly IntPtr _userHandle;

/// <summary>
///     Constructor
/// </summary>
/// <param name="username">The user of the network share</param>
/// <param name="password">The password of the network share</param>
public Impersonator(string username, string password, string userDomain =   "YOURDOMAIN")
{
    _userHandle = new IntPtr(0);
    bool returnValue = LogonUser(username, userDomain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,
                                 ref _userHandle);
    if (!returnValue)
        throw new ApplicationException(
            "The applications wasn't able to impersonate the user with the specified credentials!");
    var newId = new WindowsIdentity(_userHandle);
    _impersonatedUser = newId.Impersonate();
}

#region IDisposable Members

public void Dispose()
{
    if (_impersonatedUser != null)
    {
        _impersonatedUser.Undo();
        CloseHandle(_userHandle);
    }
}

#endregion

#region Interop imports/constants

public const int LOGON32_LOGON_INTERACTIVE = 2;
public const int LOGON32_LOGON_SERVICE = 3;
public const int LOGON32_PROVIDER_DEFAULT = 0;

[DllImport("advapi32.dll", CharSet = CharSet.Auto)]
public static extern bool LogonUser(String lpszUserName, String lpszDomain, String lpszPassword, int dwLogonType,
                                    int dwLogonProvider, ref IntPtr phToken);

[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern bool CloseHandle(IntPtr handle);

#endregion
}
19.11.2015
  • Спасибо за это. Это сработало прекрасно. Теперь, после блокировки использования, EmployeeUser не может просмотреть \\FileServer\SharedFolder, даже если попытаться немедленно. Ваше решение решило мою проблему. 20.11.2015
  • Однако, на заметку, я хотел бы узнать о проблеме с WNetCancelConnection2, Просто для образовательных целей, если не для чего-либо еще, который вернул 0, но позволил EmployeeUser просматривать \\FileServer\SharedFolder, как указано в моем исходном сообщении. 20.11.2015
  • Не знаю WNetCancelConnection2, никогда не пользовался. простите 20.11.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..