Windows系统需要针对图形界面设置有关选项,如屏幕保护程序、桌面及电源设置等。尽管有很多用户通过组策略方式配置这些选项,但是对于尚未部署活动目录(Active Directory)的企业还是在使用默认的组策略对象,为需要通过PowerShell实现这些功能。
屏幕保护程序也有潜在的安全威胁,如果用户主机中存在大量的用户,则系统管理员逐个查看用户的屏幕保护程序设置是否安全,以及设置是否按照要求将会是个很繁重的任务。创建名为“AuditScreenSaverWriteToAccess.ps1”脚本用于获取和审核主机中所有用户在系统中的屏幕保护程序设置,并将结果写入名为ConfigurationMaintenance.mdb的Access数据库文件中。创建一个新表screensaver用于保存当前信息,其结构如1所示。
图1 screensaver表的结构
创建一个screensaver表,如图2所示。其中列出screensaver表中的所有信息,并计算使用屏幕保护程序用户的比例,同时指出使用的屏幕保护程序是否安全。
图2 screensaver表
该脚本的代码如下:
param($computer="localhost", $help)
function funline ($strIN)
{
$num = $strIN.length
for($i=1 ; $i -le $num ; $i++)
{ $funline += "=" }
Write-Host -ForegroundColor yellow `n$strIN
Write-Host -ForegroundColor darkYellow $funline
}
function funHelp()
{
$helpText=@"
DESCRIPTION:
NAME: AuditScreenSaverWriteToAccess.ps1
writes secure screensaver config of a local or remote machine,
to an access database
PARAMETERS:
-computerName Specifies the name of the computer upon which to run the script
-help prints help file
SYNTAX:
AuditScreenSaverWriteToAccess.ps1 -computer WebServer
Writes secure screensaver configuration of a computer named WebServer
to an access database
AuditScreenSaverWriteToAccess.ps1
Writes secure screensaver configuration of local computer to an
access database
AuditScreenSaverWriteToAccess.ps1 -help ?
Displays the help topic for the script
"@
$helpText
exit
}
if($help){funline("Obtaining help …") ; funhelp }
$adOpenStatic = $adLockOptimistic = 3
$strDB = "C:\PowerShell\CHAPTER18\Configurationmaintenance1.mdb"
$strTable = "screensaver"
$objConnection = New-Object -ComObject ADODB.Connection
$objRecordSet = new-object -ComObject ADODB.Recordset
$objConnection.Open("Provider = Microsoft.Jet.OLEDB.4.0; `
Data Source= $strDB")
$objRecordSet.Open("SELECT * FROM $strTable", `
$objConnection, $adOpenStatic, $adLockOptimistic)
write-host -foreGroundColor yellow "Obtaining screen saver info …"
$aryscreensaver = Get-WmiObject -Class win32_desktop `
-computername $computer `
-Property name, screensaversecure, screensavertimeout, `
__server, ScreenSaverActive
foreach( $screensaver in $aryScreensaver)
{
$objRecordSet.AddNew()
$objRecordSet.Fields.item("TimeStamp") = Get-Date
$objRecordSet.Fields.item("SystemName") = $($screensaver.name)
$objRecordSet.Fields.item("Executable") = $($screensaver.screensaverExecutable)
$objRecordSet.Fields.item("Secure") = $($screensaver.ScreenSaverSecure)
$objRecordSet.Fields.item("Active") = $($screensaver.ScreenSaverActive)
$objRecordSet.Fields.item("Timeout") = $($screensaver.ScreenSaverTimeout)
$objRecordSet.Update()
write-host -foregroundColor yellow "/\" -noNewLine
}
$objRecordSet.Close()
$objConnection.Close()
其中定义了控制打开Access数据库连接方式的$adOpenStatic和$adLockOptimistic两个变量并均赋值3,该值根据Windows SDK定义。然后将Configurationmaintenance.mdb数据库的路径赋给$strDB变量,并使用$strTable变量保存将要写入内容的表名,即该脚本中使用的screensaver表。为了使用脚本操作Access数据库,必须创建连接到数据库并更新表中信息的Connection和RecordSet对象。接下来打开与数据库的连接,需要提供Provider的名称,即Microsoft.Jet.OLEDB4.0 Provider,然后使用ADODB.Connection对象的Open方法打开$objConnection.Open("Provider = Microsoft.Jet.OLEDB.4.0;Data Source= $strDB")。打开数据库连接后,使用RescordSet对象的Open方法打开记录集,并使用Write-Host cmdlet输出信息提示用户正在收集系统屏幕保护程序的信息。
为了通过WMI类收集屏幕保护程序的信息,使用Get-WmiObject cmdlet并选择Win32_Desktop WMI类。使用-computer参数通过$computer变量提供目标计算机的名称,并通过-property参数选择所需属性。然后使用foreach语句遍历上面通过WMI获取的屏幕保护程序,使用RecordSet为每个记录添加一条新记录,并且设置记录中每个字段的内容,最后使用RecordSet对象的Update()方法更新所有字段的内容。在添加每一条记录的过程中在控制台输出“/\”符号显示进度,foreach循环遍历所有记录后需要牢记使用各自的Close()方法关闭数据库的记录集RecordSet对象和连接Connection对象。
执行脚本之后打开数据库ConfigurationMaintenance.mdb文件,可以看到如图2所示的内容。
作者: 付海军
版权:本文版权归作者所有
转载:欢迎转载,为了保存作者的创作热情,请按要求【转载】,谢谢
要求:未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
个人网站: http://txj.lzuer.com/