Windows PowerShell最强的一个特质在于其扩展性。这个脚本引擎能以许多方式进行自定义,并扩展到使用默认下不可用的功能。一旦你明白基本术语和cmdlet,接下来就个性化PowerShell。
掌控PowerShell环境
使用脚本环境并不是万能之策。但是用户可以开始使用下面信息控制Windows PowerShell行为。
Profile
Profile是在PowerShell启动时运行的脚本。(我喜欢将它看成PowerShell的autoexec.bat,这可能很守旧,但仍然适用。)
有两种类型的profile,能存储于两个地点:
- System profiles——适用于所有PowerShell会话
继续阅读 »
事情的起因是这样滴:BOSS想要把公司所有邮箱账户的登录名都显示到Outlook Address Book里,办法当然简单了,修改Exchange details template(如何修改?)就可以。但是当我操作的时候就发现问题了:
公司的邮箱的登录账户是字母和数字的组成,而邮件地址根据别名生成,新建账户的时候,需要修改别名,用以生成用户的邮件地址。
比如,新建一个账户叫”Leo Huang”,登录名是:“lh1234”.默认的,系统alias值就是lh1234,我需要修改alias为leohuang,以适应邮件地址策略。
(有点绕,如果你不知道我在说什么,直接跳过吧。)。
我想做的是:
1,先修改邮件地址策略,将“%m@svrcore.com”修改为“%s%g@svrcore.com”这样地址策略就默认显示为用户的last name firet name来作为邮件地址。
2,将别名显示为用户的登录名(Exchange新建用户时,别名即为用户登录账户名。)这样修改的好处是,减少了新建账户的操作步骤。
那么我的问题就是,以前被修改过的别名,要重新更改为相应的登录名。也就是说,我要把一个AD User的信息添加(修改)到Mailbox的属性里去。即我要把SamAccountName的值添加到Alias里去。
我的办法是:
先导出用户的display name和SamAccountName。
Get-mailbox | select displayname,samaccountname | export-csv d:\mailbox.csv -Encoding unicode
然后,把displayname和SamAccountName作为变量进行赋值。
Import-Csv d:\mailbox.csv | foreach {Get-mailbox $_.DisplayName | Set-Mailbox -Alias $_.SamAccountName}
操作完成。
那么发散一下,批量的修改mailbox的属性,都可以这么去操作了。
由于IDC的日常运维外包给了vendor,所有就需要给他们一个账户,让他们至少能够远程登录到系统中去。IDC的Server又很多,只好写脚本实现了。Powershell的远程运行要比VBScript要好用得多,所以写了一个Powershell脚本,远程把用户加入到指定的计算机的本地组中。例如,我的域叫“svrcore.local”,需要处理的用户叫“vendor”,加入的组叫“Guests”。
#----------------------------------------
#CSV Sample:
#Server,
#svr1.svrcore.local
#svr2.svrcore.local
#svr3.svrcore.local
#-------------------------------------
#Usage:
#import-csv d:\list.csv | d:\adduser.ps1
#----------------------------------------
Process {
$Server = $_.Server
$strDomain = "svrcore.local"
$strGroup = "vendor"
$computer = [ADSI]("WinNT://" + $Server + ",computer")
$group = $computer.psbase.children.find("Guests")
$group.Name
function Listmemebers
{$members = $group.psbase.invoke("Members") | %{$_.GetType().InvokeMember("Name",'GetProperty',$null,$_,$null)}
$Server
$members}
$group.Add("WinNT://" + $strDomain + "/" + $strGroup)
Listmemebers
}
相应的,如果你想删除这个用户,只需要把第26行:
$group.Add("WinNT://" + $strDomain + "/" + $strGroup)
改为如下形式即可:
$group.Remove("WinNT://" + $strDomain + "/" + $strGroup)
作为一个系统管理员,如果你发现你在日常工作中没用到Powershell,那么我很沉痛的告诉你:“你OUT 啦”。
和学一门外语一样,掌握一门语言,先学习一些有用和简单的短句,会让你事半功倍哦。
入门级别
1. 像文件系统那样操作Windows Registry
2. 在文件里递回地搜索某个字符串
dir –r | select string "searchforthis"
3. 使用内存找到五个进程
ps | sort –p ws | select –last 5
4. 循环(停止,然后重启)一个服务,如DHCP
继续阅读 »
此代码适合Powershell V1,如果是V2的话,使用Send-MailMessage,并设置BodyAsHTML参数。
$objSMTPServer = "smtp.XXXX.com" #SMTP服务器地址
$objMailCred = (Get-Credential).GetNetworkCredential() #输入用户名及密码
$objMail = New-Object System.Net.Mail.MailMessage
#邮件地址
$objMailFromAddress="someone@XXXX.com"
$objMailtoAddress="someone@domain.com"
$objMail.From = New-Object System.Net.Mail.MailAddress($objMailFromAddress)
$objMail.To.Add($objMailtoAddress)
#邮件内容,使用Get-Content获得HTML格式的邮件正文
$objMail.Subject = "Test";
$objMail.Body = Get-Content e:\UserMail.htm
$objMail.IsBodyHTML = $true
#发送邮件
$objSMTP = New-Object System.Net.Mail.SmtpClient -argumentList $objSMTPServer
$objSMTP.Credentials = $objMailCred
$objSMTP.Send($objMail)