我到处都读到PowerShell是未来的方式。当它第一次发布时,我做了很多虚拟实验室,但是从那时起,我仍然没有在生产环境中使用过它。我知道要处理已经安装的操作系统的日子已经来临,所以我想做好准备。
我想知道:
- 你用吗?
- 您使用PowerShell的“引导”过程是什么?
- 您编写了什么样的系统管理任务?
- 我是SQL Server数据库管理员。与它有什么关系呢?
似乎每个人都同意Microsoft会为此努力,但实际上还没有人使用它。我希望听到系统管理员正在使用它来执行日常任务并共享一些代码示例。
我到处都读到PowerShell是未来的方式。当它第一次发布时,我做了很多虚拟实验室,但是从那时起,我仍然没有在生产环境中使用过它。我知道要处理已经安装的操作系统的日子已经来临,所以我想做好准备。
我想知道:
似乎每个人都同意Microsoft会为此努力,但实际上还没有人使用它。我希望听到系统管理员正在使用它来执行日常任务并共享一些代码示例。
Answers:
微软正在竭尽所能,使PowerShell在各地成为高级用户和自动化编写者的选择。为了执行相同的操作而在.NET中编译代码的日子已经一去不复返了,现在您只需要notepad.exe和google。我们是办公室的忠实拥护者,尤其是因为Exchange 2007的管理控制台并未包含您在PowerShell中可以做的所有事情。Microsoft故意未能实现只能在很长时间内完成一次的事情,而这种方式更容易开发,如果您具有类似于复杂环境的任何东西,则彻头彻尾地强制使用它。
管理Microsoft的新一代产品(Win7,Windows Server 2008,Exchange 2007/2010,SQL Server 2008)都具有非常丰富的PowerShell挂钩。一旦将远程Powershell(PowerShell 2.0 IIRC)与Server 2008 R2一起部署,它将对自动化编写者变得更加有用。
我们所做的是:
是的,PowerShell将与我们保持相当一段时间。
编辑:添加一个代码示例,因为它是被要求的
$ list = import-csv(“ groupusers.csv”) $ lastseengroup = $ list [0] .group $ ADGroupPrefix =“ grp.netware”。 $ ADGroupSuffix =“ {已编辑-格式为,ou = groups,dc = domain,dc = domain,dc = domain}” 清除变量成员列表 清除变量的未知用户 foreach($ list中的$ entry){ 如果($($ entry.group)-ne $ lastseengroup){ 回声“偶然发现新组$($ entry.group),将更改提交给$ lastseengroup” $ newgroup = $ ADgroupPrefix + $ lastseengroup $ newgroupdn ='“'+” cn = $ newgroup $ ADGroupSuffix“ +'”' 回显“获取$ newgroup的DN” $ existinggroup = dsquery组domainroot -name $ newgroup 如果((($ existinggroup -ne $ null)){ dsmod组$ newgroupdn -chmbr $成员列表 }其他{ dsadd组$ newgroupdn -scope u -secgrp是-members $ memberlist -desc“从eDirectory导入的组” } 清除变量成员列表 } $ User =获取用户$($ entry.member)-ErrorAction静默继续 如果($ User.isvalid){ $ UserDN = $ User.distinguishedname $ memberlist = $ memberlist +'“'+” $ UserDN“ +'”' }其他{ $ unknownusers = $ unknownusers + $($ entry.member) } $ lastseengroup = $($ entry.group) } dsadd组“ cn = $ ADGroupPrefix $ lastseengroup $ ADGroupSuffix” -scope u -secgrp是-members $ memberlist
这将使用通过perl脚本创建的CSV文件并更新一组组。如果该组已经存在,它将用文件中指定的成员身份替换成员身份。如果该组不存在,它将创建它。这是一种单向同步。此外,没有相当的生产还没有,但接近。
鉴于微软的服务器产品从一开始就将启用PowerShell(我相信Exchange的下一版本将通过PowerShell提供所有配置),并且像PowerShell in Practice这样的书描述了一些自动化否则单调任务的绝佳方法,我认为有理由建议,PowerShell在一段时间内将成为Windows Serverland中的一种流行技术。
我会推荐Scott Hanselman的Podcast#162。似乎所有Microsoft服务器团队都被“强制”提供PowerShell cmdlet,并遵循单一,一致的语法。
此外,像VMWare这样的第三方也正在采用它
简而言之,我认为从2.0开始的PowerShell可以认真地为大多数琐碎的任务替换批处理文件。
我作为SQL Server数据库管理员使用的十个PowerShell脚本(全部描述/发布在我的Blog上):
您编写了什么样的管理任务脚本?
应用程序/服务监视:从(远程)EventLog和存储过程中获取关键性能数字,并从单个批处理文件中显示它们
我是SQL Server DBA,向我展示一些很棒的东西吗?
automssqlbackup:带有轮换的MSSQL的每日备份(每天=增量,每周+每月=完整;保留5个每天,5个每周备份),压缩,电子邮件通知
我认为这很酷:使用SQL Server 2008,您将获得新的PowerShell扩展,这些扩展使您可以像浏览本地文件系统或注册表一样浏览SQL数据库。
安装SQL Server客户端工具后,您可以在PowerShell中打开任何数据库(通过右键单击上下文菜单),然后以面向对象的方式使用它:
PS SQLSERVER:\SQL\MyServer\MyInstance\Databases\ExampleDB\>function prompt {"PS >"}
PS >cd tables
PS >dir
SCHEMA NAME CREATED
------ ---- -------
dbo MyTable 25/06/2009 17:02
PS > dir | format-table name, columns, rowcount, parent
NAME COLUMNS ROWCOUNT PARENT
---- ------- -------- ------
MyTable {Id, Name} 0 {ExampleDB}
PS >$myTable = dir | where {$_.Name -eq "MyTable"}
PS >$myTable.Script()
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
CREATE TABLE [dbo].[MyTable](
[Id] [int] IDENTITY(1,1) NOT NULL
[Name] [nText] NOT NULL
) ON [PRIMARY]
PS >set-location \SQL\AnotherServer\Default
PS >cd databases\Northwind\tables
PS >$myTables = dir | where {$_.Rowcount -gt 100 -and $_.HasIndex -eq 1}
PS >$myTables.Count
8
PS >foreach ($table in $tables) {$table.RebuildIndexes(90)}
请注意,第一行只是更改了提示,因此它不会太长。
希望除此之外,这是不言而喻的:)
SQL Server 2008现在在Management Studio中具有PowerShell上下文选项,因此,Exchange对此不仅仅抱有这种选择。另外,也可以将其视为DOS的替代品,因为MS一直在思考它们的问题,因为它们不能提高DOS的向后兼容性问题的安全性,因此他们只是创建了一些新的东西,解决了问题!
我也是DBA,并且是长期的脚本编写者,回到DOS批处理文件V3.3!转到VB脚本,但PS 非常强大。看一下-抱歉,由于我是新用户,因此无法发布链接。从Otto Helweg的博客中获得了此信息。这是一种便宜而开朗的软件清单工具。
示例PowerShell脚本:
# Open the database connection
$dbConn = new-object System.Data.SqlClient.SqlConnection "server=kcdb;database=Inventory;Integrated Security=sspi"
$dbConn.Open()
$sqlQuery = $dbConn.CreateCommand()
# Get all known computers
$sqlQuery.CommandText = "select * from Inventory..Computers"
$reader = $sqlQuery.ExecuteReader()
$computersToQuery = @()
while ($reader.Read()) {
$computersToQuery += $reader["Computer"]
}
# Close the database connection
$dbConn.Close()
$softwareInventory = @{}
foreach ($computer in $computersToQuery) {
$psinfoOutput = ./psinfo.exe -s Applications \\$computer
$foundSoftwareInventory = 0
$computerName = ""
foreach ($item in $psinfoOutput) {
if ($foundSoftwareInventory -eq 1) {
# Force the results to a string
# Remove any single quotes which interfere with T-SQL statements
# Load the result into a hash whereby removing any duplicates
[string]$softwareInventory[$computerName][$item.Replace("'","")] = ""
}
if ($item -like "System information for *") {
$computerName = $item.Split("\")[2].TrimEnd(":")
} elseif ($item -eq "Applications:") {
$foundSoftwareInventory = 1
$softwareInventory[$computerName] = @{}
}
}
}
$dbConn = new-object System.Data.SqlClient.SqlConnection "server=kcdb;database=Inventory;Integrated Security=sspi"
$dbConn.Open()
$sqlQuery = $dbConn.CreateCommand()
foreach ($computer in $softwareInventory.Keys) {
foreach ($softwareItem in $softwareInventory[$computer].Keys) {
"Loading-" + $computer + ":" + $softwareItem
# Try an Update then an Insert
trap {
$sqlQuery.CommandText = "update Inventory..SoftwareInventory set AuditDate = getdate() where Computer = '" + $computer + "' and Software = '" + $softwareItem + "'"
$result = $sqlQuery.ExecuteNonQuery()
continue
}
$sqlQuery.CommandText = "insert into Inventory..SoftwareInventory (Computer,Software,AuditDate) values ('" + $computer + "','" + $softwareItem + "',getdate())"
$result = $sqlQuery.ExecuteNonQuery()
}
}
$dbConn.Close()
戴夫J
以下任务由我的团队定期使用PowerShell完成
每天,我都会一直有PS提示,并将其用于我过去使用CMD的任何一项关闭任务。
这是一些读取共享点列表的代码示例。我在PowerShell V2.0中使用来自Sharepoint的Web服务和新的“ New-WebServiceProxy” cmdlet
$url = "http://server/sites/site/_vti_bin/lists.asmx"
$listWebService = new-webServiceProxy -uri $url -UseDefaultCredential
$listName = "MyList"
$viewGuid = $null
$query= $null
$viewFields = $null
$numRowsReturned = 20000
$queryOptions = $null
$result = $listWebService.GetListItems($listName,$ViewGuid,$query,$viewFields,$numRowsReturned,$queryOptions,$null)
Oisin Grehan撰写了一篇很棒的博客文章,介绍如何使用Sharepoint Web Services作为我创建所有功能的基础。他甚至拥有一个很棒的new-webservice.ps1脚本,如果您仍在使用PowerShell V1,则可以使用该脚本。
另外,这是我用来获取群集中节点上的可用内存的基本函数
Function Get-AvailableMemory {
param
(
[string[]]
$servers
)
BEGIN {
$query = "select AvailableBytes,__SERVER from Win32_PerfRawData_PerfOS_Memory"
$availableMemory = @{
Name="AvailableMemory";
Expression = {[math]::round($_.AvailableBytes/1gb,2)}
}
$serverName = @{
Name ="Server";
Expression = {$_."__SERVER"}
}
}
PROCESS {
foreach ($server in $servers){
get-wmiobject -query $query -computer $server |
select-object $availableMemory, $serverName
}
}
END {}
}
我怎么不能使用它?现在,使用Powershell管理所有即将推出/正在升级的Microsoft服务器应用程序。然后在此核心之上提供了或多或少烦人的UI /管理控制台,该速度通常很慢,并且有人指出,缺少可用的功能...所以我不能说我们实际上有很多选择^ ^
Powershell并不是完美的,但是如果您使用过它,您就会知道它非常酷。可以访问整个.net库以及内置的cmdlet(并在2.0版中使用PS制作自己的cmdlet),这非常酷。
我认为唯一缺少的是出色的IDE,我肯定有一天会来自MS。现在,我使用Idera的powershell plus和adminscripteditor,它们允许调试并且非常酷。
我能够很好地摆脱VB的困扰。
到目前为止,我最大的项目是使用“ powershellASP”制作一个基本的网页,该网页运行powershell命令并从十几个VMWare ESXi(免费)主机中提取vmware主机和VM信息,并将其显示在HTML表中。我这样做是因为免费的VMWare ESXi和无虚拟中心,没有其他方法可以实时了解公司中的所有VM。PowershellASP是为IIS编写的免费的第三方分析器,MS不支持。因此,它现在可以做一些有限的事情,并且文档很少。
我有一堆管理/清单脚本,它们通过AD搜索不同的事物,然后通过WMI查询它们以获取重要的统计信息,例如服务器上的份额,磁盘空间,已用磁盘空间等。
通用脚本:
用户脚本:
我有一个枚举我的ESX服务器上的所有VMWare来宾计算机的计算机
我有一个脚本,可以在x天后抓取文件并将其安全删除。
基本上,我可以执行大约200行VBScript的操作,并在10个PowerShell中执行该操作。您还可以在VBScript中做一些您做不到或做的事情,例如发送带有附件的电子邮件,我会定期向我发送脚本结果。您还可以使用自定义服务名称和事件ID将有意义且唯一的条目写入事件日志。
这就是我能想到的。我现在选择的工具是PowerShell,它使生活更轻松。
基本上,它对系统管理员和Bash脚本对Unix管理员一样有用。
我正在寻找poweshell来替换我们的客户端批处理脚本-运行程序,登录脚本等。
但是发现它至少增加了10秒钟的登录时间-这就是所有“调整”到位的情况。因此最终还是坚持使用了我们所使用的东西。
不是.NET开发人员,我只能有限地使用PS允许您使用的所有与.NET相关的东西。但是,作为Exchange管理员(除其他外),Exchange 2007的PowerShell集成是AWESOME。我终于为我的邮件系统有了一个可靠的脚本引擎;到目前为止,我已经将每个月的统计信息发送给我,每个月的统计信息,根据一天中的时间调整将各种电子邮件地址分配给谁,自动在公用文件夹上创建和分配权限以及在两个邮箱邮箱数据库之间负载平衡用户。从Ex07的角度来看,另一件很酷的事情是,在GUI中执行任何操作之后,它将为您提供相关的PowerShell命令,以供您执行刚才的操作。复制这些脚本,您最终将拥有一组PS脚本,这些脚本可以从头开始削弱Exchange环境。
我的Windows管理员尚未使用PowerShell。他们都听说过,但是他们并没有花时间去熟悉它。
我决定自己看看。我来自Unix shell背景,我认为Windows最终必须有一个真正的shell编程环境。我认为Microsoft在PowerShell方面做得很好,而在某些方面做得不好。
从好的方面来说,它们将对象用作PowerShell中cmdlet之间的中介。这为PowerShell提供了一定的功能,基于文本的脚本必须破解才能正常工作。
不利的一面是,它们实际上并没有充分利用Unix shell命令的大部分。因此,学习曲线不必要地陡峭,并不能帮助人们轻松地从Unix迁移到PowerShell,反之亦然。他们所做的最多就是为某些PowerShell cmdlet定义别名,例如ls别名Get-ChildItem,而所有命令行开关都不相同。
只是我的两分钱
这更多是开发人员的答案,但这是真实世界,我们将在未来几个月的某个时候开始对其进行测试。我开始学习PowerShell,以便编写脚本将SQL Server任务带入我们的持续集成环境。持续集成脚本将主要由NAnt和MSBuild通过JetBrains TeamCity运行。
除此之外,我还打算将PowerShell用作主要的Windows命令外壳程序,以用于一般用途,尤其是用于SQL Server数据库管理任务。
抱歉,我尚未共享任何代码示例,因为我还在学习!不过,我很乐意张贴一些内容:)
这是一个单行代码示例,我刚刚用:)回答了您的另一个问题:嘿,对于Wiki ...
这将列出已安装的修补程序:
Get-ChildItem -Path “HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\HotFix”
PowerShell版本1.0在很多方面都受到很大限制,但是2.0版本进展顺利。与批处理脚本相比,它的功能要强大得多。我并没有真正将其用作外壳,仅用于脚本,因此我的经验也因此而有所不同。我不太喜欢语法(-eq
vs ==
,-gt
vs >
等),但是如果我需要做一些奇怪的事情,我很高兴能够进入.NET。我认为3.0版会很棒。现在,我将其牢牢地放在“完成工作”类别中。
我主要将其用于自动化代码部署。这是在C#中创建内容的一个亮点。与shell相关的操作(例如递归目录复制)以及Bash脚本编写者多年来一直认为的其他事情,使事情变得如此简单。