断开连接的用户的注册表审计

断开连接的用户的注册表审计

我希望获取注册表更改的 Windows 事件。现在,我发现手动,在设置事件的步骤之一中,必须编辑注册表项的审核配置(找到项->右键单击->权限->高级->审核)。

现在,假设我想为分支设置此监控:

HKCU\软件\课程

我必须找到下面的所有常规用户HKU,并为每个用户设置审核,问题是,只有在登录。我可以手动加载注册表项并添加审核:

reg load HKU\Steven C:\Users\Steven\ntuser.dat

但问题是,并非所有键都可用(例如,类不可用),老实说,这似乎是一个粗暴的解决方案。此外,还有一个难题,如果在安装后添加用户会发生什么?

在 Windows 10 上,有没有办法为所有用户添加审计配置?

答案1

当用户首次登录并创建其配置文件夹时,其用户配置单元将被初始化为默认用户配置单元的副本,存储在此处:

C:\Users\Default\NTUSER.DAT

创建配置文件后,副本是独立的,因此没有方便的方法一次性编辑所有用户的配置文件。但是,如果您加载并编辑该配置单元,这些更改将反映在任何后续创建的配置文件中。

Classes密钥存储在单独的配置单元中,您可以单独加载和编辑该配置单元:

%USERPROFILE%\AppData\Local\Microsoft\Windows\UsrClass.dat

不幸的是,没有默认的类配置单元;在创建配置文件时,它似乎被初始化为一个空的配置单元。


为了让您处理这一切不那么繁琐,我编写了一个 PowerShell 脚本,用于对 下加载的每个给定子树进行审计规则HKEY_USERS。但首先,我们需要启用审计权限,这需要大量的代码(改编自李·霍姆斯):

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 标签 wiki。然后加载下所有必要的配置单元HKEY_USERS。您可以从提升的 PowerShell 提示符运行脚本,如下所示:

.\regaudit.ps1 -Subkeys 'Steven\Control Panel', 'Steven\Software\Microsoft'

请注意,您不应包含HKCU或任何此类根。您可以传递任意数量的子项。或者,您可以创建一个每行一个子项的文本文件,并像这样使用它:

.\regaudit.ps1 -Subkeys (gc .\toaudit.txt)

注意:除非在本地安全策略的审计策略部分中启用了“审计对象访问”,否则审计事件不会出现在安全日志中。

进一步阅读:.NET 中的访问控制

相关内容