Все привет, приведу листинг того как можно копировать удалять и вообще работать в папки с повышеными правами, даже с включеным uac. Однако имей ввиду что надо использовать повышенные права администратора для своего приложения. Вторым моментом стоит использовать проект сборку Any CPU
Теперь добавим класс DisableFsRedirection в свой проект.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
sealed class DisableFsRedirection : IDisposable { [DllImport("kernel32.dll", SetLastError = true)] static extern bool Wow64DisableWow64FsRedirection(ref IntPtr ptr); [DllImport("kernel32.dll", SetLastError = true)] static extern bool Wow64RevertWow64FsRedirection(IntPtr ptr); [ThreadStatic] IntPtr _oldValue; [ThreadStatic] bool _revert; public DisableFsRedirection() { _oldValue = IntPtr.Zero; try { _revert = Wow64DisableWow64FsRedirection(ref _oldValue); } catch (EntryPointNotFoundException) { GC.SuppressFinalize(this); } } ~DisableFsRedirection() { Dispose(false); } public void Dispose() { Dispose(true); } void Dispose(bool disposing) { if (disposing) { GC.SuppressFinalize(this); } if (_revert) { Wow64RevertWow64FsRedirection(_oldValue); _oldValue = IntPtr.Zero; _revert = false; } } } |
И теперь мы можем с помощью этого класса, использовать обычные методы копирования, удаления файла.
1 2 3 4 5 6 |
using (new DisableFsRedirection()) { File.Copy(@"C:\Windows\System32\сmd.exe", @"C:\Windows\System32\cmd.exe"); } |
А с помощью следующего метода мы можем изменить разрешения на доступ к файлу. Его вы можете посмотреть в свойствах файла в разделе безопасность. В приведённом ниже листинге полный доступ к файлу будет получен текущим пользователем, так же в нем можно изменить на любую группу пользователя.
1 2 3 4 5 6 7 |
String filename = @"C:\Windows\System32\cmd.exe"; WindowsIdentity identity = WindowsIdentity.GetCurrent(); var account = new NTAccount(identity.Name); FileSecurity fSecurity = File.GetAccessControl(filename); fSecurity.RemoveAccessRule(new FileSystemAccessRule(account, FileSystemRights.FullControl, AccessControlType.Deny)); fSecurity.AddAccessRule(new FileSystemAccessRule(account, FileSystemRights.FullControl, AccessControlType.Allow)); File.SetAccessControl(filename, fSecurity); |