Запись в скрытую сетевую папку

273
11 мая 2017, 10:00

Здравствуйте форумчане!

Есть скрытая сетевая папка \server\Подразделения$.

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

У меня цель скопировать существующий на локальной машине файл в эту расшаренную скрытую сетевую директорию.

Написал такой код, который работает отлично не на скрытых папках:

                try
                {
                   var fileName = "PIDStat_PCMSMNPZGOBKK_" + DateTime.Now.ToString("yyyyMMddHHmm") + ".csv";
                    string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, fileName);

                    var remote = Path.Combine(@"\\server\Подразделения$\", fileName);
                    File.Copy(filePath, remote);
                }
                catch
                {
                }

Ловлю Exception UnauthorizedAccessException.

Насколько понимаю, проблема с доступом.

Собственно вопрос, как программно предоставить нужные права (свою учетку).

Либо если не в этом дело, просьба порекомендовать, как обойти данную проблему.

Спасибо!

Answer 1

Я думаю, что Net use должен помочь.

Монтируем шару под нужной учеткой через создание процесса CMD и обращаемся к ней, как к обычному диску.

В конце, при необходимости, размонтируешь диск.

Еще когда-то на просторах интернета находил вот такую штуку:

namespace Imeprsonalization
{
 public enum LogonType
 {
  LOGON32_LOGON_INTERACTIVE = 2,
  LOGON32_LOGON_NETWORK = 3,
  LOGON32_LOGON_BATCH = 4,
  LOGON32_LOGON_SERVICE = 5,
  LOGON32_LOGON_UNLOCK = 7,
  LOGON32_LOGON_NETWORK_CLEARTEXT = 8, // Win2K or higher
  LOGON32_LOGON_NEW_CREDENTIALS = 9 // Win2K or higher
 };
 public enum LogonProvider
 {
  LOGON32_PROVIDER_DEFAULT = 0,
  LOGON32_PROVIDER_WINNT35 = 1,
  LOGON32_PROVIDER_WINNT40 = 2,
  LOGON32_PROVIDER_WINNT50 = 3
 };
 public enum ImpersonationLevel
 {
  SecurityAnonymous = 0,
  SecurityIdentification = 1,
  SecurityImpersonation = 2,
  SecurityDelegation = 3
 }
 class Win32NativeMethods
 {
  [DllImport("advapi32.dll", SetLastError = true)]
  public static extern int LogonUser( string lpszUserName,
       string lpszDomain,
       string lpszPassword,
       int dwLogonType,
       int dwLogonProvider,
       ref IntPtr phToken);
  [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  public static extern int DuplicateToken( IntPtr hToken,
        int impersonationLevel,
        ref IntPtr hNewToken);
  [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  public static extern bool RevertToSelf();
  [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
  public static extern bool CloseHandle(IntPtr handle);
 }
 /// <summary>
 /// Allows code to be executed under the security context of a specified user account.
 /// </summary>
 /// <remarks> 
 ///
 /// Implements IDispose, so can be used via a using-directive or method calls;
 ///  ...
 ///
 ///  var imp = new Impersonator( "myUsername", "myDomainname", "myPassword" );
 ///  imp.UndoImpersonation();
 ///
 ///  ...
 ///
 ///   var imp = new Impersonator();
 ///  imp.Impersonate("myUsername", "myDomainname", "myPassword");
 ///  imp.UndoImpersonation();
 ///
 ///  ...
 ///
 ///  using ( new Impersonator( "myUsername", "myDomainname", "myPassword" ) )
 ///  {
 ///   ...
 ///   1
 ///   ...
 ///  }
 ///
 ///  ...
 /// </remarks>
 public class Impersonator : IDisposable
 {
  private WindowsImpersonationContext _wic;
  /// <summary>
  /// Begins impersonation with the given credentials, Logon type and Logon provider.
  /// </summary>
  ///
  public Impersonator(string userName, string domainName, string password, LogonType logonType, LogonProvider logonProvider)
  {
   Impersonate(userName, domainName, password, logonType, logonProvider);
  }
  /// <summary>
  /// Begins impersonation with the given credentials.
  /// </summary>
  ///
  public Impersonator(string userName, string domainName, string password)
  {
   Impersonate(userName, domainName, password, LogonType.LOGON32_LOGON_INTERACTIVE, LogonProvider.LOGON32_PROVIDER_DEFAULT);
  }
  /// <summary>
  /// Initializes a new instance of the <see cref="Impersonator"/> class.
  /// </summary>
  public Impersonator()
  {}
  /// <summary>
  /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
  /// </summary>
  public void Dispose()
  {
   UndoImpersonation();
  }
  /// <summary>
  /// Impersonates the specified user account.
  /// </summary>
  ///
  public void Impersonate(string userName, string domainName, string password)
  {
   Impersonate(userName, domainName, password, LogonType.LOGON32_LOGON_INTERACTIVE, LogonProvider.LOGON32_PROVIDER_DEFAULT);
  }
  /// <summary>
  /// Impersonates the specified user account.
  /// </summary>
  ///
  public void Impersonate(string userName, string domainName, string password, LogonType logonType, LogonProvider logonProvider)
  {
   UndoImpersonation();
   IntPtr logonToken = IntPtr.Zero;
   IntPtr logonTokenDuplicate = IntPtr.Zero;
   try
   {
    // revert to the application pool identity, saving the identity of the current requestor
    _wic = WindowsIdentity.Impersonate(IntPtr.Zero);
    // do logon & impersonate
    if (Win32NativeMethods.LogonUser(userName,
        domainName,
        password,
        (int)logonType,
        (int)logonProvider,
        ref logonToken) != 0)
    {
     if (Win32NativeMethods.DuplicateToken(logonToken, (int)ImpersonationLevel.SecurityImpersonation, ref logonTokenDuplicate) != 0)
     {
      var wi = new WindowsIdentity(logonTokenDuplicate);
      wi.Impersonate(); // discard the returned identity context (which is the context of the application pool)
     }
     else
      throw new Win32Exception(Marshal.GetLastWin32Error());
    }
    else
     throw new Win32Exception(Marshal.GetLastWin32Error());
   }
   finally
   {
    if (logonToken != IntPtr.Zero)
     Win32NativeMethods.CloseHandle(logonToken);
    if (logonTokenDuplicate != IntPtr.Zero)
     Win32NativeMethods.CloseHandle(logonTokenDuplicate);
   }
  }
  /// <summary>
  /// Stops impersonation.
  /// </summary>
  private void UndoImpersonation()
  {
   // restore saved requestor identity
   if (_wic != null)
    _wic.Undo();
   _wic = null;
  }
 }
}

Создаешь объект с нужными учетными данными и можешь обращаться к шаре от другой учетки.

READ ALSO
ICommand и получение ссылки на окно

ICommand и получение ссылки на окно

Добрый день, занялся реализацией кастомной командыРеализовал ICommand и все отлично работает, но возникла мысль, а хорошо бы получать данные...

245
Обработка doubleClick в заголовках и строках DataGrid WPF

Обработка doubleClick в заголовках и строках DataGrid WPF

Требуется по разному обрабатывать doubleClick по заголовку и по строкам в DataGridSelectedIndex не подходит, так как при doubleClick по заголовку в SelectedIndex находится...

284
Оценка производительности regex

Оценка производительности regex

Какой алгоритм используется в regex c#? Мой метод состоит в основном из операций с регулярными выражениями, интересует как оценить асимптотическую...

168
Как защитить файл от повреждения при отключении питания?

Как защитить файл от повреждения при отключении питания?

Программа хранит ряд настроек в xml-файлеЕсли в момента записи настройки отключается питание компьютера, содержимое файла пропадает (сам...

251