【问题标题】:Active Directory and Powershell活动目录和 Powershell
【发布时间】:2012-06-06 19:20:07
【问题描述】:

我目前正在将 VB 中的脚本重写为 Powershell 脚本。

脚本的作用是根据脚本用户输入在我们的 Active Directory 中搜索用户。

Function PromptForName{
    $nameInput = "*"
    $nameInput += Read-Host ("Please enter a full or partial name.")
    $nameInput += "*"
    return $nameInput
}

Function FindUsers{
    param ([string]$n)
    $usersArray = Get-ADUser -f {DisplayName -like $n} | Select-Object Name
    return $usersArray
}

此代码将打印出正确的姓名列表。然后我想要做的是允许用户选择其中一个名称,并获得有关该人的更多信息。我坚持允许脚本用户选择其中一个名称。

如何提示其他输入;该框将显示 FindUsers 提供的所有名称的编号列表,然后根据他们选择的用户返回一个数字?我完全迷路了。

这就是我目前正在尝试的方式,尽管我很确定这是完全错误的。

Function PrintUsers{
    param $a
    [int]$i, $j
    [string]$userList
    $j = 1
    foreach($object in $array){
        $userList += ($j + $array[$i])
        $j++
    }
    return $userList
} 

Function SelectUser{
    param $list
    $user = Read-Host ($list)
}

编辑:

我已将我的功能更新为以下内容:

Function FindUsers{
    param ([string]$n)
    $usersArray = @(Get-ADUser -f {DisplayName -like $n} | Select-Object Name| Format-List)
    return $usersArray
}

Function PrintUsers{
    param ([String[]]$array)
    $i
    for($i = 1; $i -lt $usersArray.length; $i++){
        Write-Host "$i. $($usersArray[$i-1].Name)"
    }
}

FindUsers 之后的输出是这样的: 姓名:xxxxx yyyyy 姓名:xxxxx zzzzz 等等

所以 $usersArray 的返回是打印所有这些。 在 PrintUsers 函数之前,我不希望进行任何打印,并且我希望它采用编号列表类型格式,如下所示: 1. xxxx yyyy 2. xxxx zzzz 等等

我很难弄清楚这一点。

【问题讨论】:

  • 看看这里technet.microsoft.com/en-us/library/ff730949.aspx。这可以帮助您为用户选择添加一些 gui。
  • @Christian 我希望脚本用户能够输入一个数字(因为可能的用户将是一个编号列表),然后只需按 Enter 键即可获取数字,必须使用鼠标放慢速度。此脚本适用于 IT 服务台。

标签: windows powershell vbscript active-directory


【解决方案1】:
# get all users
$usersArray = @(Get-ADUser -f {DisplayName -like $n} )

# create menu
for($i=1; $i -le $usersArray.count; $i++){
    Write-Host "$i. $($usersArray[$i-1].Name)"
}

# prompt for user number
$user = Read-Host Enter the user number to get more info

# display full info for selected user
$usersArray[$user-1] | Format-List *

【讨论】:

  • 谢谢!现在我知道如何在窗口中显示该信息,可能是消息框或其他东西
  • 这一行:Write-Host "$i.$($usersArray[$i-1].Name)" 不起作用。它应该打印该数组中所有用户名的编号列表,对吗?
  • 是的。 $usersArray/ 中是否有任何对象,如果有,它们是否有 Name 属性?
  • 它现在似乎正在工作,但我遇到了一些奇怪的问题,即 Get-ADUser 不返回某些用户。例如,如果我搜索我的名字,脚本会挂起并且找不到我,或者如果我搜索 Ryan,它会找到两个 Ryan L,但搜索 Ryan L 只会返回一个人。
  • 你在使用 ADUC 时会得到不同的结果吗?
【解决方案2】:

使用 Add-Member 为每个用户添加唯一标识符。让我们将进程视为用户对象,例如:

$procs = gps;
$procs = $procs | % { $i=0; } {
    Add-Member -MemberType NoteProperty -InputObject $_ -Name Number -Value $i -PassThru;
    $i++;
};
$procs | select Number,Name;
$procid = Read-Host -Prompt 'Enter the number of the process you would like to operate on';
$proc = $procs | ? { $_.Number -eq $procid };
Write-Host -Object ('Operating on proc: {0}' -f $proc.Name);

【讨论】:

  • 在我得到所有用户名后使用它?抱歉,我不太明白你在做什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-27
  • 1970-01-01
  • 2021-06-06
  • 2014-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多