0

I need to write a file while impersonated as another user John (Member of administrator).

What happens: File is written and created, then all Access Control is removed and added (Full Control).

No matter where in this process i try to Encrypt file access is denied

  1. using FileOptions
  2. Using File.Encrypt.

my worked around to at least encrypt was with opening another impersonation later on.

But No matter what i do, i can't Decrypt or even read the encrypted Text file.

If file is encrypted reading or decrypting fails, even though i can read or write just fine while impersonated.

In some scenarios Everything works fine, But after a system restart or logout, again fails with access denied.

For impersonation i used this answers Impersonation

            using (impersonate = new ImpersonateUser(ImpersonationType.WinIdentity, Domain, User, SecurePassword))
            {
                System.Diagnostics.Debug.WriteLine($"Before Impersonation: {Environment.UserName}");
                done = impersonate.RunImpersonated(() =>
                {
                    System.Diagnostics.Debug.WriteLine($"After Impersonation: {Environment.UserName}");

                    //if (Util.IsWindowsEncrypted(ConfigFullPath)) File.Decrypt(ConfigFullPath);
                    var json = File.ReadAllText(ConfigFullPath);

                    var configFile_data = SerializationUtil.Deserialize<Config>(json);
                    //if (!Util.IsWindowsEncrypted(ConfigFullPath)) File.Encrypt(ConfigFullPath);
                });
            }

A working repository to reproduce is available here Repository containing full sample, See CreateConfig or ReadConfig method in Config.cs

(if you were able to create and read a encrypted file, check if after restart it is the same)

A Workaround i just found was to create a Process before doing any impersonation.

    using (Process cmd = new Process())
    {

        ProcessStartInfo startInfo = new ProcessStartInfo
        {
            FileName = "cmd.exe",
            Arguments = $"/c",
            UseShellExecute = false,
            UserName = user,
            Password = pass,
            LoadUserProfile = true
        };
        cmd.StartInfo = startInfo;
        cmd.Start();
    }
Masoud R
  • 102
  • 3
  • 10

0 Answers0