Когда пользователь впервые входит в систему и создается его папка профиля, его пользовательский куст инициализируется как копия пользовательского куста по умолчанию, которая хранится здесь:
C:\Users\Default\NTUSER.DAT
После создания профиля копии становятся независимыми, поэтому удобного способа редактировать профили всех пользователей за один раз нет. Однако, если вы загрузите и отредактируете этот улей, изменения будут отражены во всех впоследствии созданных профилях.
Ключ Classes
хранится в отдельном кусте, который вы можете загружать и редактировать отдельно:
%USERPROFILE%\AppData\Local\Microsoft\Windows\UsrClass.dat
К сожалению, улей по умолчанию не существует; при создании профиля он инициализируется пустым кустом.
Чтобы сделать все это менее утомительным для вас, я написал сценарий PowerShell для правила аудита для каждого из указанных поддеревьев, загруженных в HKEY_USERS
. Но сначала нам нужно включить привилегию аудита, которая требует удивительного количества кода (адаптировано из Lee Holmes):
param(
## The privilege to adjust.
$Privilege,
## The process on which to adjust the privilege. Defaults to the current process.
$ProcessId = $pid,
## Switch to disable the privilege, rather than enable it.
[Switch] $Disable
)
## Taken from P/Invoke.NET with minor adjustments.
$definition = @'
using System;
using System.Runtime.InteropServices;
public class AdjPriv
{
[DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
internal static extern bool AdjustTokenPrivileges(IntPtr htok, bool disall,
ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen);
[DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
internal static extern bool OpenProcessToken(IntPtr h, int acc, ref IntPtr phtok);
[DllImport("advapi32.dll", SetLastError = true)]
internal static extern bool LookupPrivilegeValue(string host, string name, ref long pluid);
[StructLayout(LayoutKind.Sequential, Pack = 1)]
internal struct TokPriv1Luid
{
public int Count;
public long Luid;
public int Attr;
}
internal const int SE_PRIVILEGE_ENABLED = 0x00000002;
internal const int SE_PRIVILEGE_DISABLED = 0x00000000;
internal const int TOKEN_QUERY = 0x00000008;
internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;
public static bool EnablePrivilege(long processHandle, string privilege, bool disable)
{
bool retVal;
TokPriv1Luid tp;
IntPtr hproc = new IntPtr(processHandle);
IntPtr htok = IntPtr.Zero;
retVal = OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok);
tp.Count = 1;
tp.Luid = 0;
if(disable)
{
tp.Attr = SE_PRIVILEGE_DISABLED;
}
else
{
tp.Attr = SE_PRIVILEGE_ENABLED;
}
retVal = LookupPrivilegeValue(null, privilege, ref tp.Luid);
retVal = AdjustTokenPrivileges(htok, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero);
return retVal;
}
}
'@
$processHandle = (Get-Process -id $ProcessId).Handle
try {
Add-Type $definition
} catch {} # Silent failure on re-registration
[AdjPriv]::EnablePrivilege($processHandle, $Privilege, $Disable)
Сохраните это как privs.ps1
. Затем мы можем использовать его в нашем скрипте, который должен находиться в том же каталоге:
Param (
[string[]]$Subkeys
)
$rights = 'ChangePermissions,CreateSubKey,CreateLink,Delete,SetValue,TakeOwnership'
.\privs.ps1 -Privilege SeSecurityPrivilege
$users = [Microsoft.Win32.RegistryKey]::OpenBaseKey('Users', 'Default')
$Subkeys | % {
$key = $users.OpenSubKey($_, $true)
$acl = $key.GetAccessControl()
$rule = [System.Security.AccessControl.RegistryAuditRule]::new([System.Security.Principal.NTAccount]::new('Everyone'), $rights, 'ContainerInherit,ObjectInherit', 'None', 'Success')
$acl.AddAuditRule($rule)
$key.SetAccessControl($acl)
$key.Close()
}
Для каждого из предоставленных подразделов создается правило, которое проверяет успешные изменения (определяемые переменной $rights
в верхней части, которую вы можете изменить) в этом ключе или подразделах. Сохраните его как файл PS1, например, regaudit.ps1
. Если вы еще этого не сделали, включите выполнение скрипта PowerShell, как указано в вики-теге PowerShell . Затем загрузите все необходимые ульи под HKEY_USERS
. Вы можете запустить скрипт из командной строки PowerShell с повышенными правами следующим образом:
.\regaudit.ps1 -Subkeys 'Steven\Control Panel', 'Steven\Software\Microsoft'
Обратите внимание, что вы не должны включать HKCU
или любой такой рут. Вы можете передать столько подключей, сколько захотите. Кроме того, вы можете создать текстовый файл с одним подключом на строку и использовать его следующим образом:
.\regaudit.ps1 -Subkeys (gc .\toaudit.txt)
Примечание. События аудита не будут отображаться в журнале безопасности, если в разделе "Политика аудита" локальной политики безопасности не включен "Доступ к объекту аудита".
Дальнейшее чтение: Контроль доступа в .NET