PowerShell与AD

水如烟 2010-02-02 10:49:24
加精
多时不写代码,手真生疏了许多。这段时间,用在域管理的时间多些,开始用PowerShell。

说了是刚开始用,因此,运用的方法不一定适合您。权当交流。

老话:仅供参考。

什么是PowerShell?
官方解释:
Windows PowerShell 是专为系统管理员设计的新 Windows 命令行 shell。Windows PowerShell 包括交互式提示和脚本环
境,两者既可以独立使用也可以组合使用。

与接受和返回文本的大多数 shell 不同,Windows PowerShell 是在 .NET Framework 公共语言运行时 (CLR) 和 .NET
Framework 的基础上构建的,它接受和返回 .NET Framework 对象。环境中的这一根本更改带来了管理和配置 Windows 的
全新工具和方法。

Windows PowerShell 引入了 cmdlet(读作“command-let”)的概念,这是内置到 shell 中的一个简单的单一功能命令行
工具。可以分别使用每个 cmdlet,但是组合使用这些简单的工具执行复杂任务时才发挥其作用。Windows PowerShell 包括
一百多个基本的核心 cmdlet,您可以编写自己的 cmdlet 并与其他用户共享它们。

与许多 shell 一样,Windows PowerShell 为您提供了对计算机上文件系统的访问。此外,使用 Windows PowerShell 提供
程序还可以访问其他数据存储,如注册表和数字签名证书存储,就像访问文件系统一样容易。


PowerShell下载地址:
http://support.microsoft.com/kb/968930


PowerShell与AD(二)

...全文
2684 58 打赏 收藏 转发到动态 举报
写回复
用AI写文章
58 条回复
切换为时间正序
请发表友善的回复…
发表回复
lfywy 2010-04-08
  • 打赏
  • 举报
回复
C#也可以拿到这些域下面的内容,请参照此文:
http://www.cnblogs.com/lifuyun/archive/2009/11/23/lifuyun09112301.html
戈壁上的月光 2010-02-24
  • 打赏
  • 举报
回复
新鲜事物,好久没给自己充电了,都快成没有价值的古董了!
zrl05 2010-02-21
  • 打赏
  • 举报
回复
这个太强大了,感觉学不会啊...............
netcup 2010-02-17
  • 打赏
  • 举报
回复
powershell确实功能强大,刚装上WIN2008 R2和SQL2008时大概看了下,试了两下,确实不错,但是一直没时间深入,学习了!!
水如烟 2010-02-12
  • 打赏
  • 举报
回复
示例:

$Path = New-LdapPath
$Path

结果:
Root : LDAP://DC=mydomain,DC=local
Input :
Path : LDAP://DC=mydomain,DC=local
Parent : LDAP://DC=mydomain,DC=local
Name :

接着:
$path.Input = "CN=Users,DC=mydomain,DC=local"
$Path
结果:
Root : LDAP://DC=mydomain,DC=local
Input : CN=Users,DC=mydomain,DC=local
Path : LDAP://CN=Users,DC=mydomain,DC=local
Parent : LDAP://DC=mydomain,DC=local
Name : CN=Users

接着:
$Path.Add("CN=LzmTW")
$Path
结果:
Root : LDAP://DC=mydomain,DC=local
Input : LDAP://CN=LzmTW,CN=Users,DC=mydomain,DC=local
Path : LDAP://CN=LzmTW,CN=Users,DC=mydomain,DC=local
Parent : LDAP://CN=Users,DC=mydomain,DC=local
Name : CN=LzmTW

接着:
$Path.Name="HanMo"
$Path
结果:
Root : LDAP://DC=mydomain,DC=local
Input : LDAP://CN=HanMo,CN=Users,DC=mydomain,DC=local
Path : LDAP://CN=HanMo,CN=Users,DC=mydomain,DC=local
Parent : LDAP://CN=Users,DC=mydomain,DC=local
Name : CN=HanMo
水如烟 2010-02-12
  • 打赏
  • 举报
回复
New-LdapPath

可以将它理解为一个类.它实现以上节点路径处理功能。

属性:
Name 获取或重置当前节点路径名称。
Input 获取或设置当前节点路径。
Path 获取以”LDAP://“开头的节点路径,其值由Input决定。只读。
Parent 获取节点路径Path的父节点路径。只读。
Root 获取当前所在域的根节点路径。只读。

方法:
Add 在当前节点路径对应容器中定位子节点路径。
GetDirectoryEntry 返回当前节点路径的DirectoryEntry。
水如烟 2010-02-11
  • 打赏
  • 举报
回复
New-Variable -Name LdapRoot -Visibility Private -Option Readonly -value ([String]::Concat("LDAP://" ,([adsi]"LDAP://RootDSE").defaultNamingContext)) -Scope Global

Function Global:New-LdapPath
{
$object = New-Object Management.Automation.PSObject

Add-Member -in $object ScriptProperty Root {$LdapRoot}{Throw "root readonly"}

Add-Member -in $object NoteProperty Input ""

Add-Member -in $object ScriptProperty Path `
{
$path = $this.Root

$value = $this.Input
If ($value )
{

If ($value -is [string])
{
$value = $value.Trim()
If ($value.StartsWith("LDAP://")){$path = $value }
Else { If ($value) {$path = "LDAP://" + $value } }
}
Else { If ($value.distinguishedName){$path = "LDAP://" + $value.distinguishedName} }
}

$path
} `
{Throw "Path readonly"}

Add-Member -in $object ScriptProperty Parent `
{
$path = $this.Path

If($path -ne $this.Root){$path = ($path -Replace "LDAP://((CN|OU)=.*?,)(OU|CN|DC)=","LDAP://`$3=")}

$path
} `
{Throw "Parent readonly"}

Add-Member -in $object ScriptProperty Name `
{
$name=""

If($this.Path -ne $this.Root){$name = [System.Text.RegularExpressions.Regex]::Match($this.Path ,"LDAP://((CN|OU)=.*?),(OU|CN|DC)=.*").Groups[1].Value}

$name
} `
{
$name = $args[0]

If(!$this.Name){Return}

If (!$name){Return }
If ($name -isnot [string]){throw "must be string"}

$name = $name.Trim()
If (!$name){Return }

If ($name.IndexOf("=") -gt -1){throw "don't input '='"}

$this.Input = ($this.Path -Replace "(LDAP://(CN|OU)=)(.*?)(,(OU|CN|DC)=.*)","`$1$Name`$4")
}

Add-Member -in $object ScriptMethod Add `
{
$cnName = $args[0]

If (!$cnName){Return }
If ($cnName -isnot [string]){throw "must be string"}

$cnName = $cnName.Trim()

If (!$cnName){Return }

If ($cnName -notmatch "(CN|OU)=\w+"){throw "cnName should be 'CN=*' or 'OU=*'"}

$this.Input = ($this.Path -Replace "(LDAP://)(.*)","`$1$cnName,`$2")
}

Add-Member -in $object ScriptMethod GetDirectoryEntry `
{
[adsi]$this.Path
}

$object
}
linlovewo 2010-02-10
  • 打赏
  • 举报
回复
好东西。。。支持!。。。。。。
xuejie09242 2010-02-10
  • 打赏
  • 举报
回复
8cuo8cuo 回复内容太短了!
wmq6541 2010-02-10
  • 打赏
  • 举报
回复
好东西。。。。学习了...
HanMo 2010-02-09
  • 打赏
  • 举报
回复
4、Rename-Ldap
PS D:\psEnv> $path ="LDAP://CN=csdnlzmtw,OU=VB.NET,OU=TopC,DC=mydomain,DC=local"
$NewUser = Rename-Ldap $path "NewUser"
"`r";$Path;$NewUser

LDAP://CN=csdnlzmtw,OU=VB.NET,OU=TopC,DC=mydomain,DC=local
LDAP://CN=NewUser,OU=VB.NET,OU=TopC,DC=mydomain,DC=local
HanMo 2010-02-09
  • 打赏
  • 举报
回复
3、Add-LdapChild
PS D:\psEnv> $path ="LDAP://CN=csdnlzmtw,OU=VB.NET,OU=TopC,DC=mydomain,DC=local"
$parent = Get-ldapParent $Path
$NewUser = Add-ldapChild $Parent "CN=NewUser"
"`r";$Path;$parent;$NewUser

LDAP://CN=csdnlzmtw,OU=VB.NET,OU=TopC,DC=mydomain,DC=local
LDAP://OU=VB.NET,OU=TopC,DC=mydomain,DC=local
LDAP://CN=NewUser,OU=VB.NET,OU=TopC,DC=mydomain,DC=local
study_hard520 2010-02-09
  • 打赏
  • 举报
回复
来转转。。。。看看讲得好多啊
study_hard520 2010-02-09
  • 打赏
  • 举报
回复
LAIZHUANZHUAN
francis86 2010-02-09
  • 打赏
  • 举报
回复
不错,路过不容错过。学习一下啊!!!
guotaishun 2010-02-09
  • 打赏
  • 举报
回复
ddddddddddddddddddddddddddddddddd
ufo188 2010-02-08
  • 打赏
  • 举报
回复
三分三分三分三分三分三分
水如烟 2010-02-08
  • 打赏
  • 举报
回复
2、Get-LdapParent
取父点路径
PS D:\psEnv> $Root = Get-Ldap
$Path ="LDAP://CN=099f1587-af70-49c6-ab6c-7b3e82be0fe2,CN=Operations,CN=ForestUpdates,CN=Configuration,DC=mydomain,DC=local"
While($Path -ne $Root)
{
Write-Host $Path
$Path = Get-LdapParent $Path
}
$Path

LDAP://CN=099f1587-af70-49c6-ab6c-7b3e82be0fe2,CN=Operations,CN=ForestUpdates,CN=Configuration,DC=mydomain,DC=local
LDAP://CN=Operations,CN=ForestUpdates,CN=Configuration,DC=mydomain,DC=local
LDAP://CN=ForestUpdates,CN=Configuration,DC=mydomain,DC=local
LDAP://CN=Configuration,DC=mydomain,DC=local
LDAP://DC=mydomain,DC=local
水如烟 2010-02-08
  • 打赏
  • 举报
回复
四个路径函数的应用示例1、Get-Ldap命令
$ldap = Get-Ldap
$ldap
结果:
PS D:\psEnv> $ldap = Get-Ldap
$ldap

LDAP://DC=mydomain,DC=local


命令
$ldap = Get-Ldap ([adsi]"LDAP://CN=csdnlzmtw,OU=VB.NET,OU=TopC,DC=mydomain,DC=local")
$ldap
结果:
PS D:\psEnv> $ldap = Get-Ldap ([adsi]"LDAP://CN=csdnlzmtw,OU=VB.NET,OU=TopC,DC=mydomain,DC=local")
$ldap

LDAP://CN=csdnlzmtw,OU=VB.NET,OU=TopC,DC=mydomain,DC=local
水如烟 2010-02-08
  • 打赏
  • 举报
回复
如非特别声明,以下代码创建在一个ldap.ps1脚本文件里面.

创建两个全局只读私有的变量

一个存储域的根节点路径
一个存储userPrincipalName UPN用户邮件服务器部分

New-Variable -Name LdapRoot -Visibility Private  -Option Readonly -value ([String]::Concat("LDAP://" ,([adsi]"LDAP://RootDSE").defaultNamingContext)) -Scope Global
New-Variable -Name LdapMail -Visibility Private -Option Readonly -value ((([adsi]"LDAP://RootDSE").ldapServiceName.Value).SubString((([adsi]"LDAP://RootDSE").ldapServiceName.Value).LastIndexOf("@"))) -Scope Global



为了简化路径操作,
创建四个路径操作函数
Function Global:Get-Ldap($entry)
{
If ($entry){"LDAP://" + $entry.distinguishedName}
Else{$LdapRoot}
}

Function Global:Get-LdapParent([String]$ldap)
{
If($ldap)
{
If($ldap -eq $LdapRoot){$LdapRoot}
Else
{
$ldap -Replace "LDAP://((CN|OU)=.*?,)(OU|CN|DC)=","LDAP://`$3="
}
}
Else{$LdapRoot}
}

Function Global:Add-LdapChild([String]$ldap,[string]$cnName)
{
$cnName = $cnName.Trim()
$ldap -Replace "(LDAP://)(.*)","`$1$cnName,`$2"
}

Function Global:Rename-Ldap([String]$ldap,[string]$newName)
{
$newName = $newName.Trim()
$ldap -Replace "(LDAP://(CN|OU)=)(.*?)(,(OU|CN|DC)=.*)","`$1$newName`$4"
}
加载更多回复(37)

16,553

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧