Move file using ImpersonateLoggedOnUser

I try to move the file, but gives this error:

System.UnauthorizedAccessException: Path access denied.
in System.IO .__ Error.WinIOError (Int32 errorCode, String maybeFullPath)
in System.IO .__ Error.WinIOError ()
in System.IO.FileInfo.MoveTo (String destFileName)

To move the file, I have this 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);
        }                   
    }

To personalize, I:

[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;
        }           
    }

If I set the folder / file to permissions for everyone, this works, but I do not want this. What am I doing wrong?

+3
source share
2 answers

The transaction with this code is completed.

[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

[DllImport("advapi32.DLL")]
public static extern bool RevertToSelf();

[DllImport("kernel32.dll")]
public extern static bool CloseHandle(IntPtr hToken);

enum LogonType
{
    Interactive = 2,
    Network = 3,
    Batch = 4,
    Service = 5,
    Unlock = 7,
    NetworkClearText = 8,
    NewCredentials = 9
}

enum LogonProvider
{
     Default = 0,
     WinNT35 = 1,
     WinNT40 = 2,
     WinNT50 = 3
}

int valid = LogonUser(
    ssUsername,
    ssDomain,
    ssPassword,
    (int)LogonType.Interactive,
    (int)LogonProvider.WinNT50,
    out admin_token);

if (valid != 0)
{
    using (WindowsImpersonationContext context = WindowsIdentity.Impersonate(admin_token))
    {
        CloseHandle(admin_token);
        FileInfo fi = new FileInfo(ssPath);

        //Destination Directory does not exist ?
        if (!Directory.Exists(Path.GetDirectoryName(ssDestinationDirectoryPath)))
            Directory.CreateDirectory(Path.GetDirectoryName(ssDestinationDirectoryPath));

        fi.CopyTo(ssDestinationDirectoryPath);
        fi.Delete();
    }
}
+3
source

: , ?

ssDestinationDirectoryPath?

, , , , .

0

Source: https://habr.com/ru/post/1747984/


All Articles