Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell在第一次foreach循环运行完成后调用另一个PS1 in循环完成_Powershell_Loops_Foreach_Wrapper - Fatal编程技术网

Powershell在第一次foreach循环运行完成后调用另一个PS1 in循环完成

Powershell在第一次foreach循环运行完成后调用另一个PS1 in循环完成,powershell,loops,foreach,wrapper,Powershell,Loops,Foreach,Wrapper,我有两个Powershell脚本,一个是主脚本(ServerInfo.ps1),另一个是用作包装器的辅助脚本,在循环中启动第一个脚本,该循环将在每个循环上使用不同的凭据,因为对不同的AD域/林进行了查询,每个域需要不同的域凭据 如果我从各个域中的计算机上手动和本地运行主脚本,并且根据需要运行(从远程计算机获取详细信息并导出到csv),则主脚本在单独运行时运行良好 以下是包装器脚本(出于安全原因更改了域名示例) 具体来说,这将用于查询每个域上具有相同提升权限帐户的域控制器,因为成员计算机上使用的帐

我有两个Powershell脚本,一个是主脚本(ServerInfo.ps1),另一个是用作包装器的辅助脚本,在循环中启动第一个脚本,该循环将在每个循环上使用不同的凭据,因为对不同的AD域/林进行了查询,每个域需要不同的域凭据

如果我从各个域中的计算机上手动和本地运行主脚本,并且根据需要运行(从远程计算机获取详细信息并导出到csv),则主脚本在单独运行时运行良好

以下是包装器脚本(出于安全原因更改了域名示例)

具体来说,这将用于查询每个域上具有相同提升权限帐户的域控制器,因为成员计算机上使用的帐户在域控制器上没有内置管理员或AD(域/企业管理员)级别的权限。其目的也是从域成员而不是在DC上本地运行脚本

由于主脚本(serverinfo.ps1)包含1000多行代码,我只想说,通过包装器传递参数“-ServerType DCS”,serverinfo.ps1首先从帐户所属的各个域的AD中获取所有域控制器名称,并执行诸如每个DC的WMI和注册表查询等操作,将输出导出到CSV文件

对于第一个域,这运行正常,没有任何问题,ServerInfo.ps1脚本执行查询第一个域中每个DC的任务,但随后两个PowerShell脚本关闭/停止运行,而不会继续运行到包装器循环中的第二个域,即“foreach($domain$Domains)”第一个域完成后,循环将不工作

由于我在包装器中没有看到任何脚本错误,并且ServerInfo.Ps1中没有Exit或其他取消/完成命令,因此我不知道包装器为什么不能按预期工作

对于第一个域,它运行良好,没有任何问题,并且 ServerInfo.ps1脚本执行查询第一个域中的每个DC的任务 域,但随后两个PowerShell脚本在没有它的情况下关闭/停止运行 继续到包装器循环aka中的第二个域,即“foreach” ($Domain$Domains)”循环在第一个域 完成

我很确定你的循环是有效的。只需在该循环中插入一个
Write Host“iterationfordomain:$domain”
,您就会看到,它确实会在所有域上进行迭代

我更关心的是你对另一个剧本的称呼。使用
Start Process-Credential
将在所提供用户的用户空间中执行该过程。在您的场景中,如果您希望在任何域计算机上为所有域运行它,这将需要域之间的任何信任关系。有吗?
如果没有,则必须以某种安全的方式将凭据传递给被调用的脚本,以便在使用远程控制cmdlet时对其自身进行身份验证。

关于您的查询:在您的场景中,如果要在任何域计算机上为所有域运行该脚本,这将需要域之间的任何信任关系。有吗?是的,我们在大多数森林中都有信托,所以这必然不会成为问题(我们在Prod forest中有6个域,我将从Prod成员计算机运行它,并从与成员计算机相同的域启动我的Prod normal帐户下的包装器,查询所有Prod域DC,还查询单独的测试和开发森林域DC。我还采纳了添加一个write-ho的建议。)st在循环中报告被查询的域,我目前正在运行查询,但从所用的时间长度来看,它只会完成第一个域,而不会查询其他域(第一个域由大约40个DC组成,因此完成第一个域大约需要1小时,然后脚本停止,而我预计完成所有域还需要3个多小时)脚本刚刚完成,在它像我预期的那样只运行了第一个域之后,虽然循环中的写主机显示它确实对所有域进行了循环,但我没有可见的错误输出,以确定哪些似乎没有对其他域实际运行powershell脚本。我想我要休息一下在此处,通过在指向另一个域的循环外部运行命令来进一步调试此问题,以查看$error output…Start Process:由于错误而无法运行此命令:登录失败:您登录的计算机受身份验证防火墙保护。不允许使用指定的帐户要向计算机进行身份验证。在第11行char:1+启动进程powershell.exe-凭据$Credential-nonewindow-Wo…+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~类别信息:无效操作:(:~~~~~~~~~~启动进程],InvalidOperationException+FullyQualifiedErrorId:InvalidOperationException,Microsoft.PowerShell.Commands.StartProcessCommands这似乎是因为我来自其他域/林的$credential帐户没有适当的访问权限登录到我运行脚本的计算机,我假设是从错误中获取的,因此我想我回到了开始介绍如何使用每个域的备用帐户执行此操作
# This is a Wrapper Script for ServerInfo.ps1
$username = Read-Host -Prompt 'Enter User Account to be used - Do not specify domain'
$Password = Read-Host -Prompt 'Input User Password - NOTE must be the same on all domains' -AsSecureString
$domains = "d1.contoso.com","d2.contoso.com","dev.contosodev1.com","test.contosotest1.com"
$Arguments = "-file c:\serverinfo\ServerInfo.ps1", "-ServerType 'DCs'"

ForEach ($domain in $domains) {
$Credential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList "$domain\$username", $Password
Start-Process powershell.exe -Credential $credential -NoNewWindow -ArgumentList $Arguments -WorkingDirectory 'c:\Serverinfo\' -Wait
}