title: Move a file with ImpersonateLoggedOnUser
body: <p>I am trying to move a file, but gives this error:</p>
  
  <blockquote>
    <p>System.UnauthorizedAccessException: Access to the path is denied..<br>
    at  System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)<br>
    at System.IO.__Error.WinIOError()<br>
    at System.IO.FileInfo.MoveTo(String destFileName)</p>
  </blockquote>
  
  <p>To move the file, I have this code:</p>
  
  <pre><code>public void MssFile_Move (string ssPath, string ssDestinationDirectoryPath, string ssDomain, string ssUsername, string ssPassword, out string ssError_message) {
          IntPtr admin_token = IntPtr.Zero;
          ssError_message = "";
  
          try
          {
              DoImpersonateLoggedOnUser(  ssDomain
                            , ssUsername
                            , ssPassword
                            , out ssError_message
                            , out admin_token);                   
  
  
              FileInfo fi = new FileInfo(ssPath);
              //Destination Directory does not exist ?
              if ( !Directory.Exists(Path.GetDirectoryName(ssDestinationDirectoryPath)))
                      Directory.CreateDirectory(Path.GetDirectoryName(
                      ssDestinationDirectoryPath));
              fi.MoveTo (ssDestinationDirectoryPath);
  
              DoRevertToSelf(ssDomain);
  
          }
          catch (System.Exception se)
          {
              int ret = Marshal.GetLastWin32Error();
              ssError_message += "Win32Error: " + ret + "\n";
              ssError_message += se.ToString();
          }
          finally
          {
              if (admin_token != IntPtr.Zero)
                  CloseHandle(admin_token);
          }                   
      }
  </code></pre>
  
  <p>To impersonate I have:</p>
  
  <pre><code>[DllImport("advapi32.DLL", SetLastError = true)]
          public static extern int LogonUser(string lpszUsername, string lpszDomain,
              string lpszPassword, int dwLogonType, int dwLogonProvider, out IntPtr phToken);
          [DllImport("advapi32.DLL")]
          public static extern bool ImpersonateLoggedOnUser(IntPtr hToken); //handle to token for logged-on user
  
  
  public void DoImpersonateLoggedOnUser (     string ssDomain
                                              ,   string ssUsername
                                              ,   string ssPassword
                                              ,   out string ssError_message
                                              ,   out IntPtr admin_token)
      {
          IntPtr phToken = IntPtr.Zero;
          admin_token = IntPtr.Zero;
          ssError_message = "";
  
          if (ssDomain != "")
          {
              if (LogonUser(ssUsername, ssDomain, ssPassword, 9, 0, out phToken) != 0)
              {
                  ImpersonateLoggedOnUser(phToken);           
              }
              else
              {
                  int nErrorCode = Marshal.GetLastWin32Error();
  
                  ssError_message = "Operation Failed, error: " + nErrorCode;
              }
              admin_token = phToken;
          }           
      }
  </code></pre>
  
  <p>If I set the folder /file to permissions everyone, it works, but I don't want that. What am I doing wrong?</p>