我创建了一个基于 Active-Directory 模块的登录脚本,它查询用户组成员以映射他的驱动器等。
我已经用 PowerGui 编译它,并创建了一个 EXE 文件。问题是,用户计算机上不存在该模块。
有没有办法在没有模块的情况下做到这一点,或者将模块添加到编译中?
我创建了一个基于 Active-Directory 模块的登录脚本,它查询用户组成员以映射他的驱动器等。
我已经用 PowerGui 编译它,并创建了一个 EXE 文件。问题是,用户计算机上不存在该模块。
有没有办法在没有模块的情况下做到这一点,或者将模块添加到编译中?
对于组成员资格,您也可以在不连接到 AD 的情况下获取它,并解析 WHOAMI 实用程序的输出
$groups = WHOAMI /GROUPS /FO CSV | ConvertFrom-Csv | Select-Object -ExpandProperty 'Group Name'
if($groups -contains 'group1')
{
do something
}
一种方法是使用 Active-Directory 服务接口 (ADSI)。
您可以在另一个 SO 帖子中找到(我可以将用户与不同域的组匹配吗?)一种使用 ADSI 查找用户所属的所有组的方法,在帖子中它是 C# 代码,但很容易翻译。
这是一个简单搜索开始的小例子。
Clear-Host
$dn = New-Object System.DirectoryServices.DirectoryEntry ("LDAP://WM2008R2ENT:389/dc=dom,dc=fr","jpb@dom.fr","Pwd")
# Look for a user
$user2Find = "user1"
$Rech = new-object System.DirectoryServices.DirectorySearcher($dn)
$rc = $Rech.filter = "((sAMAccountName=$user2Find))"
$rc = $Rech.SearchScope = "subtree"
$rc = $Rech.PropertiesToLoad.Add("mail");
$theUser = $Rech.FindOne()
if ($theUser -ne $null)
{
Write-Host $theUser.Properties["mail"]
}
另一种方法是使用System.DirectoryServices.AccountManagement 命名空间。
这种方式也是使用ADSI,不过是封装的,需要Framework .NET 3.5。您还可以在同一篇文章中的 Edited (2011-10-18 13:25)部分中找到使用这种方式的 C# 代码。
您还可以使用 WMI :
$user2Find = "user1"
$query = "SELECT * FROM ds_user where ds_sAMAccountName='$user2find'"
$user = Get-WmiObject -Query $query -Namespace "root\Directory\LDAP"
$user.DS_mail
您可以在本地服务器上或域内的计算机上使用此解决方案,但从域外向 WMI 进行身份验证会稍微复杂一些。