mirror of
https://github.com/ZuneDev/ZuneModdingHelper.git
synced 2026-07-27 13:12:21 -07:00
Split TakeOwnership code into TokenManipulator
This commit is contained in:
@@ -23,7 +23,6 @@ namespace ZuneModCore.Mods
|
|||||||
|
|
||||||
public override string Id => nameof(VideoSyncMod);
|
public override string Id => nameof(VideoSyncMod);
|
||||||
|
|
||||||
#pragma warning disable CA1416 // Validate platform compatibility
|
|
||||||
public override async Task<string?> Apply()
|
public override async Task<string?> Apply()
|
||||||
{
|
{
|
||||||
// Make a backup of the original file
|
// Make a backup of the original file
|
||||||
@@ -39,23 +38,8 @@ namespace ZuneModCore.Mods
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// Activate necessary admin privileges to make changes without NTFS perms
|
// Take ownership of DLL
|
||||||
TokenManipulator.AddPrivilege("SeRestorePrivilege"); // Necessary to set Owner Permissions
|
TokenManipulator.TakeOwnership(wmvDllInfo);
|
||||||
TokenManipulator.AddPrivilege("SeBackupPrivilege"); // Necessary to bypass Traverse Checking
|
|
||||||
TokenManipulator.AddPrivilege("SeTakeOwnershipPrivilege"); // Necessary to override FilePermissions
|
|
||||||
|
|
||||||
// Get access control
|
|
||||||
FileSecurity security = wmvDllInfo.GetAccessControl();
|
|
||||||
SecurityIdentifier? cu = WindowsIdentity.GetCurrent().User;
|
|
||||||
if (cu == null)
|
|
||||||
return "Failed to set permissions on WMVCORE.dll, current user was null.";
|
|
||||||
|
|
||||||
// Set owner to current user
|
|
||||||
security.SetOwner(cu);
|
|
||||||
security.SetAccessRule(new FileSystemAccessRule(cu, FileSystemRights.Modify, AccessControlType.Allow));
|
|
||||||
|
|
||||||
// Update the Access Control on the original WMVCORE.dll
|
|
||||||
wmvDllInfo.SetAccessControl(security);
|
|
||||||
|
|
||||||
// Replace with pre-Anniversary Update WMVCORE.dll
|
// Replace with pre-Anniversary Update WMVCORE.dll
|
||||||
await File.WriteAllBytesAsync(wmvDllInfo.FullName, wmvDllAniv);
|
await File.WriteAllBytesAsync(wmvDllInfo.FullName, wmvDllAniv);
|
||||||
@@ -71,7 +55,6 @@ namespace ZuneModCore.Mods
|
|||||||
return ex.Message;
|
return ex.Message;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#pragma warning restore CA1416 // Validate platform compatibility
|
|
||||||
|
|
||||||
public override Task<string?> Reset()
|
public override Task<string?> Reset()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ namespace ZuneModCore.Mods
|
|||||||
|
|
||||||
// Make a backup if it doesn't already exist
|
// Make a backup if it doesn't already exist
|
||||||
FileInfo zsDllBackupInfo = new(Path.Combine(StorageDirectory, "ZuneService.original.dll"));
|
FileInfo zsDllBackupInfo = new(Path.Combine(StorageDirectory, "ZuneService.original.dll"));
|
||||||
if (zsDllBackupInfo.Exists)
|
if (!zsDllBackupInfo.Exists)
|
||||||
{
|
{
|
||||||
File.Copy(zsDllInfo.FullName, zsDllBackupInfo.FullName, true);
|
File.Copy(zsDllInfo.FullName, zsDllBackupInfo.FullName, true);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.IO;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
using System.Security.AccessControl;
|
||||||
|
using System.Security.Principal;
|
||||||
|
|
||||||
namespace ZuneModCore.Win32
|
namespace ZuneModCore.Win32
|
||||||
{
|
{
|
||||||
@@ -69,5 +72,43 @@ namespace ZuneModCore.Win32
|
|||||||
throw;
|
throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#pragma warning disable CA1416 // Validate platform compatibility
|
||||||
|
public static void TakeOwnership(FileInfo file)
|
||||||
|
{
|
||||||
|
// Activate necessary admin privileges to make changes without NTFS perms
|
||||||
|
AddPrivilege("SeRestorePrivilege"); // Necessary to set Owner Permissions
|
||||||
|
AddPrivilege("SeBackupPrivilege"); // Necessary to bypass Traverse Checking
|
||||||
|
AddPrivilege("SeTakeOwnershipPrivilege"); // Necessary to override FilePermissions
|
||||||
|
|
||||||
|
// Get access control
|
||||||
|
FileSecurity security = file.GetAccessControl();
|
||||||
|
SecurityIdentifier? cu = WindowsIdentity.GetCurrent().User;
|
||||||
|
|
||||||
|
// Set owner to current user
|
||||||
|
security.SetOwner(cu);
|
||||||
|
security.SetAccessRule(new FileSystemAccessRule(cu, FileSystemRights.Modify, AccessControlType.Allow));
|
||||||
|
|
||||||
|
// Update the Access Control on the original WMVCORE.dll
|
||||||
|
file.SetAccessControl(security);
|
||||||
|
}
|
||||||
|
#pragma warning restore CA1416 // Validate platform compatibility
|
||||||
|
|
||||||
|
|
||||||
|
public static bool TryTakeOwnership(FileInfo file, out Exception? exception)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
TakeOwnership(file);
|
||||||
|
|
||||||
|
exception = null;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
exception = ex;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,13 +6,9 @@ using Microsoft.AppCenter.Analytics;
|
|||||||
using Microsoft.WindowsAPICodePack.Dialogs;
|
using Microsoft.WindowsAPICodePack.Dialogs;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using OwlCore.AbstractUI.Models;
|
using OwlCore.AbstractUI.Models;
|
||||||
using OwlCore.AbstractUI.ViewModels;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Navigation;
|
using System.Windows.Navigation;
|
||||||
using ZuneModCore;
|
using ZuneModCore;
|
||||||
|
|||||||
Reference in New Issue
Block a user