【问题标题】:How to reference a property from another command?如何从另一个命令引用属性?
【发布时间】:2021-11-06 01:46:34
【问题描述】:

所以我试图设置一个脚本来解锁用户帐户。

现在这就是我所拥有的:

function unlocktm

{
$user = read-host "Who is the user?"

Unlock-ADAccount -Identity $user -Credential adminaccount

Write-host "Account for $user has been unlocked!"
}

现在是困难的部分,我们的用户名是基于他们的电子邮件。我们像去年一样切换了电子邮件格式。所以有些人的电子邮件是 jdoe@company.com 而其他人的电子邮件是 john.doe@company.com

所以当我现在拥有的那个脚本问“谁是用户?”时我必须输入并知道用户的用户名样式(first.lastname 或 flastname)。好吧,有 1500 个用户,我不完全知道每个人的电子邮件。

所以我想做的就是让它在询问“这个用户是谁?”时做到这一点。我可以只输入 John Doe,它将运行我设置的第二个脚本,该脚本可以在 AD 中搜索该用户,提取属性并将其应用到第一个脚本中。让我解释得更好。目前我有第二个脚本是这样的:

function findtm

{
$Firstname = Read-Host "What is the users Firstname?"
$Lastname = Read-Host "What is the Users Lastname?"
Get-ADUser -Filter "Surname -like '$Lastname*' -and GivenName -like '$Firstname*'"
}

这会提取有关该用户的信息并向我展示他们的电子邮件样式。该电子邮件样式位于“samaccountname”下。

所以最终,我需要它做的是:

我运行该函数,它要求我提供用户。

我可以输入“John Doe”

然后它将在后台运行第二个脚本来搜索“John Doe”,然后如果找到 John Doe,它会获取“samaccountname”属性(john.doe 或 jdoe),并将其附加到代替“john doe”回答,然后脚本为 john doe 运行 unlockad 命令并解锁他的帐户。

我可能在很大程度上考虑过这一点,但我认为 If-else 可以做到,但我不知道如何设置它以提取“samaccountname”属性。

【问题讨论】:

  • 不需要第二个脚本,您可以将两个函数放在一个脚本中。

标签: powershell


【解决方案1】:

在我看来,您应该将函数视为独立的单元,将所需的信息作为参数接收。我通常会将提示或用户交互留给最外层。

考虑Get-ADUser 返回的对象也可以与Unlock-ADAccount 一起使用。

function unlocktm
{
param($Identity)

Unlock-ADAccount -Identity $Identity -Credential adminaccount

Write-host "Account for $($Identity.SamAccountName) has been unlocked!"
}

function findtm
{
param($Firstname, $Lastname)
Get-ADUser -Filter "Surname -like '$Lastname*' -and GivenName -like '$Firstname*'"
}

# the outer script area
$Firstname = Read-Host "What is the users Firstname?"
$Lastname = Read-Host "What is the Users Lastname?"

$Id = findtm -Firstname $Firstname -Lastname $Lastname
unlocktm -Identity $id

现在,如果你想让它更花哨一点:

function unlocktm
{
  [CmdletBinding()]
  param(
    [Parameter(ValueFromPipeline=$true)]
    $Identity
  )

  Process {
    Unlock-ADAccount -Identity $Identity -Credential adminaccount

    Write-host "Account for $($Identity.SamAccountName) has been unlocked!"
  }
}

function findtm
{
param($Firstname, $Lastname)
Get-ADUser -Filter "Surname -like '$Lastname*' -and GivenName -like '$Firstname*'"
# by simply calling this, the value returned becomes the return value of your function
}

# the outer script area
$Firstname = Read-Host "What is the users Firstname?"
$Lastname = Read-Host "What is the Users Lastname?"

findtm -Firstname $Firstname -Lastname $Lastname | unlocktm

有很多可能性,但也许这是一个好的开始?

【讨论】:

  • 仅供参考,使用[Parameter(Mandatory)] 通常比使用Read-Host 更好,Powershell 将为您完成所有其余工作。
  • @marsze 我知道,但有时在尝试回答某人的问题时最好不要一次改变太多。其他时候,我对所有可能性都做了很长的回答;今天,我根本没有时间。但好消息是,如果您想发布一个答案,它也会为其他答案留出空间! ?
  • 这就是我将其作为评论提及的原因。不是批评您的答案,而是为 OP 提供信息。
  • @marsze 当然,谢谢
  • @marsze 和 briantist 非常感谢!这回答了我的问题,真的很有帮助!我很欣赏你的智慧!
猜你喜欢
  • 1970-01-01
  • 2021-09-29
  • 1970-01-01
  • 1970-01-01
  • 2013-02-11
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 2013-01-11
相关资源
最近更新 更多