大柚子

这世界不过如此

前言

在平常的应急响应中,往往需要收集服务器的系统日志文件,但是要是手工一个一个收集,委实太麻烦了,所以想要通过脚本一键收集。

复制文件及文件夹

1、创建文件夹或文件


mkdir DirectoryName   //创建文件夹
mkdir -p DirectoryName1/DirectoryName2  //批量创建文件夹
new-item -Type d -Name  DirectoryName  //Powershell创建文件夹

2、复制文件或文件夹

(1)复制文件–通过Copy-Item完成


copy-Item -Path c:\windows\System32\Winevt\Logs\Security.evtx -Destination E:\学习记录\test\

如果目标文件存在,则尝试复制失败,若要覆盖之前存在的目标,则加入force参数


copy-Item -Path c:\windows\System32\Winevt\Logs\Security.evtx -Destination E:\学习记录\test\

(2)复制文件夹

复制文件夹和复制文件操作差不多,此为将test复制到test2


copy-item -path e:\学习记录\test -recurse e:\学习记录\test2

且可以模糊匹配


copy-item  -filter *.rar -path e:\学习记录 -Recurse -destination e:\学习记录\test3

注:此命令会陷入死循环,因为复制项也在学习记录文件夹下,最终导致报错(所以不要放在同一目录下)

使用脚本批量复制

1、创建.ps1文件,将批量获取日志功能直接在脚本中完成


#设置获取系统日志名
$logPath1="C:\Windows\System32\Winevt\Logs"
$LogFileLists="Microsoft-Windows-TerminalServices-RemoteConnectionManager%4Operational.evtx","Microsoft-Windows-TerminalServices-LocalSessionManager%4Operational.evtx","Security.evtx","Windows Powershell.evtx","Application.evtx","System.evtx","Microsoft-Windows-TerminalServices-LocalSessionManager%4Operational.evtx","Microsoft-Windows-TerminalServices-RemoteConnectionManager%4Operational.evtx","Microsoft-Windows-PowerShell%4Operational.evtx"

#在当前文件夹创建一个logfilebak文件夹放置log文件
$logFilebak=$PSScriptRoot +"\logfilebak"
mkdir $logFilebak
#复制系统日志
foreach($logFileName in $logFileLists)
{
    $logfilepath=$logpath1+$logfileName
    copy-item  -path $logfilepath -destination $logFilebak
}

2、 此时会存在一个问题,因为系统日志的访问需要管理员权限,所以需要鼠标右键“管理员方式”打开powershell后去执行ps1文件。如何在脚本中实现这个功能呢?

(1)ps1脚本文件开头加入如下内容


If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))

{  
$arguments = "& '" + $myinvocation.mycommand.definition + "'"
Start-Process powershell -Verb runAs -ArgumentList $arguments
Break
}

你的ps1脚本

或者一行式:


if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -File

但是用非管理员权限打开powershell后执行此脚本会触发用户账户控制弹框。

(2)利用批处理文件(*.bat)形式,在双击时使用管理权限运行powershell脚本。此批处理文件需要和powershell脚本具有相同的名称。


@echo off

set scriptFileName=%~n0
set scriptFolderPath=%~dp0
set powershellScriptFileName=%scriptFileName%.ps1

powershell -Command "Start-Process powershell "-ExecutionPolicy Bypass -NoProfile -NoExit -Command `"cd \`"<span class="has-inline-color has-accent-color">%scriptFolderPath%\</span>\`"; &amp; \`".\<span class="has-inline-color has-primary-color">%powershellScriptFileName%</span>\`"`"" -Verb RunAs"

注:代码标红部分需要注意‘\’,scriptfolderpath变量值中本身就有\。

Print Friendly, PDF & Email

发表回复

您的电子邮箱地址不会被公开。