我创建了一个基于Active-Directory模块的登录脚本,该脚本查询用户组成员资格以映射其驱动器等。
我用PowerGui编译了它,并创建了一个EXE文件。 问题是,用户计算机上不存在该模块。
有没有办法在没有模块的情况下执行此操作,或者将模块添加到编译中?
答案 0 :(得分:2)
对于组成员身份,您也可以在不连接到AD的情况下获取它,并解析WHOAMI实用程序的输出
$groups = WHOAMI /GROUPS /FO CSV | ConvertFrom-Csv | Select-Object -ExpandProperty 'Group Name'
if($groups -contains 'group1')
{
do something
}
答案 1 :(得分:1)
一种方法是使用Active-Directory服务接口(ADSI)。
你可以在另一个SO帖子(Can I match a user to a group accross different domains?)中找到一种方法来查找用户所属的所有组,使用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 Namespace。
这种方式也使用ADSI,但它是封装的,你需要Framework .NET 3.5。您还可以在same post但在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进行身份验证会更复杂。