如何解决Powershell foreach 和 if 语句
我正在尝试检查凭据管理器中是否有任何“域”条目,如果“域”条目 DOESN"T 存在,则会出现一个弹出窗口,供用户输入用户名和密码。如果它存在,那么只需停止脚本。
假设此 PowerShell 脚本在 Windows 登录时运行,以便在 Windows 凭据管理器中不存在域凭据时添加域凭据,然后映射网络驱动器。如果脚本检测到没有在 Windows 凭据管理器中添加域凭据 - 那么它会提示用户输入它。
我对我的逻辑错误感到困惑,当代码运行时,它会忽略 IF 语句并继续弹出用户名和密码窗口,即使 Windows 凭据管理器中存在域用户并运行 cmdkey /add 和 net use 命令。
我正在使用 Intune 部署此脚本,并且我在没有 IF 语句的情况下对其进行了测试,并且运行良好。我试图在再次测试之前先使 IF 语句起作用。
这是我的代码:
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$error.clear()
try {
cmdkey /list | foreach {
if($_ -match 'Domain')
{
[PSCustomObject]@{Account = $matches.1}
[System.Windows.Forms.MessageBox]::Show("Already exist!")
}
else {
# Captures username
#-------------------------------------------------------------------------
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
$form = New-Object System.Windows.Forms.Form
$form.Text = "Enter Username"
$form.Size = New-Object System.Drawing.Size(300,200)
$form.StartPosition = "CenterScreen"
$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Point(75,120)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = "OK"
$OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
$form.AcceptButton = $OKButton
$form.Controls.Add($OKButton)
$CancelButton = New-Object System.Windows.Forms.Button
$CancelButton.Location = New-Object System.Drawing.Point(150,120)
$CancelButton.Size = New-Object System.Drawing.Size(75,23)
$CancelButton.Text = "Cancel"
$CancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
$form.CancelButton = $CancelButton
$form.Controls.Add($CancelButton)
$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(10,20)
$label.Size = New-Object System.Drawing.Size(280,20)
$label.Text = "Enter Username: "
$form.Controls.Add($label)
$textBox = New-Object System.Windows.Forms.TextBox
$textBox.Location = New-Object System.Drawing.Point(10,40)
$textBox.Size = New-Object System.Drawing.Size(260,20)
$form.Controls.Add($textBox)
$form.Topmost = $True
$form.Add_Shown({$textBox.Select()})
$result = $form.ShowDialog()
if ($result -eq [System.Windows.Forms.DialogResult]::OK)
{
$x = $textBox.Text
$x
}
# Captures password
#-------------------------------------------------------------------------
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
$form = New-Object System.Windows.Forms.Form
$form.Text = "Enter Password"
$form.Size = New-Object System.Drawing.Size(300,20)
$label.Text = "Enter Password: "
$form.Controls.Add($label)
$textBox = New-Object System.Windows.Forms.TextBox
$textBox.Location = New-Object System.Drawing.Point(10,20)
$form.Controls.Add($textBox)
$form.Topmost = $True
$form.Add_Shown({$textBox.Select()})
$result = $form.ShowDialog()
if ($result -eq [System.Windows.Forms.DialogResult]::OK)
{
$x2 = $textBox.Text
$x2
}
cmdkey.exe /add:ae7msd-dc /user:$x /pass:$x2
net use U: "\\SERVER\FOLDER" /persistent:yes
break
}
}
}
catch { [System.Windows.Forms.MessageBox]::Show("Not Working!") }
if (!$error) {
[System.Windows.Forms.MessageBox]::Show("IT'S DONE!")
}
这是当没有域用户添加到 Windows 凭据管理器时我在 Powershell 编辑器上得到的输出:
PS C:\Users\hadi> C:\temp\add-cred.ps1
GAC Version Location
--- ------- --------
True v4.0.30319 C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Windows.Forms\v4.0_4.0.0.0__b77a5c561934e089\System.Windows.Forms.dll
hmohsen
Abc!2345
CMDKEY: Credential added successfully.
The command completed successfully.
OK
这就是我在运行脚本时得到的结果,即使已经有一个域用户添加到 Windows 凭据管理器中:
PS C:\Users\hadi> C:\temp\add-cred.ps1
GAC Version Location
--- ------- --------
True v4.0.30319 C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Windows.Forms\v4.0_4.0.0.0__b77a5c561934e089\System.Windows.Forms.dll
hmohsen
Abc!2345
CMDKEY: Credential added successfully.
net : System error 85 has occurred.
At C:\temp\add-cred.ps1:124 char:2
+ net use U: "\\SERVER\FOLDER" /persistent:yes
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (System error 85 has occurred.:String) [],remoteexception
+ FullyQualifiedErrorId : NativeCommandError
The local device name is already in use.
OK
我的目标是在 Windows 凭据管理器中有域用户条目时停止脚本脚本,但脚本仍然继续运行。 逻辑有缺陷,但我该如何修复它!
解决方法
您的代码的问题在于以下语句:
cmdkey /list | foreach {
if($_ -match 'Domain')
if
语句永远不会评估为真,因为匹配永远不会为真。
cmdkey /list
命令返回一个格式化字符串数组。您要匹配的字符串将是 Type: Domain
(前后可能有空格)。
将您的代码更改为以下内容应该会得到正确的匹配:
cmdkey /list | ForEach-Object {
if($_ -like '*Type: Domain*')
{
[PSCustomObject]@{Account = $matches.1}
[System.Windows.Forms.MessageBox]::Show("Already exist!")
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。