活动介绍

PowerShell远程执行与数据管理指南

发布时间: 2025-08-13 01:52:10 阅读量: 8 订阅数: 18
PDF

PowerShell自动化实战:从脚本到企业级解决方案

### PowerShell远程执行与数据管理指南 #### 1. 数据保存与CSV文件处理 在进行大量机器检查时,如检查50、500甚至1000台机器,若在检查过程中网络中断或PowerShell控制台关闭,重新启动脚本会从头开始检查所有设备,这会造成时间的巨大浪费。为避免这种情况,可将返回数据保存到PowerShell之外,最简单的方法是将其导出为CSV文件。PowerShell原生支持使用`Import-Csv`和`Export-Csv` cmdlet进行对象与CSV文件的导入和导出,且CSV数据易于人类阅读。 在使用`Export-Csv` cmdlet追加到现有CSV文件时,需注意它只会包含当前标题行中的字段,因此脚本返回的所有数据应使用相同格式。若在每次远程执行后导出结果,当需要重启脚本时可重新导入。具体操作如下: 1. 检查CSV文件是否存在。 2. 若存在,将数据加载到变量中。 3. 使用该变量过滤机器列表,排除已检查的机器。 过滤时,要使用脚本用于创建远程会话的值,而非返回数据中的名称。例如,使用`Invoke-Command` cmdlet时,`PSComputerName`属性会自动添加到输出中,通过对其进行过滤可防止因控制脚本使用FQDN而脚本返回NetBIOS或使用DNS别名导致的重复提交。 另外,为连接失败的机器创建单独的CSV导出文件,这样它们不会与所需的实际结果存储在同一CSV文件中,还能提供一个用于故障排除和修复失败连接的优秀列表。 #### 2. PowerShell通过WS-Management (WSMan)进行远程操作 在Active Directory环境中使用PowerShell时,WSMan是最佳选择。它不仅支持Active Directory身份验证,而且在Windows服务器操作系统上默认启用。还可使用组策略对象 (GPO) 启用WSMan远程操作,使设置更加轻松。 ##### 2.1 启用WSMan PowerShell远程操作 目前,只有Windows PowerShell可通过GPO控制,而PowerShell Core不行。若要使用PowerShell 6或更高版本执行远程命令,需在每台服务器上运行`Enable-PSRemoting` cmdlet,可添加`-Force`开关以在启用时避免提示: ```powershell Enable-PSRemoting -Force ``` 若运行`Enable-PSRemoting` cmdlet时收到一个或多个网络连接为公共连接的错误,可包含`-SkipNetworkProfileCheck`开关或将连接设为私有。 此外,`Enable-PSRemoting` cmdlet仅为运行该命令的版本启用远程PowerShell。例如,在PowerShell 7会话中运行该cmdlet,不会为Windows PowerShell启用远程操作,反之亦然。 ##### 2.2 WSMan PowerShell远程操作的权限 默认情况下,Administrators和Remote Management Users组的成员有权通过PowerShell远程连接到服务器。Remote Management Users组的用户通常具有标准用户的权限,除非他们在服务器上有额外权限。 对于VS Code扩展场景,需授予用户管理员权限,因为他们需要读取每个用户配置文件中的文件。 ##### 2.3 使用WSMan PowerShell远程操作执行命令 远程服务器设置好后,即可开始执行远程命令。接下来要确定如何执行远程操作并记录结果,可使用控制脚本调用之前创建的`Get-VSCodeExtensions.ps1`脚本,此控制脚本也可用于在多个不同系统上执行其他所需脚本。 使用`Invoke-Command` cmdlet时,脚本文件只需本地客户端可访问,无需远程服务器可访问。也可传递脚本块,这适用于一到两行的命令,但传递复杂脚本时,最好将其保存为单独的脚本文件,这样可使控制脚本可重用,避免命令硬编码。 需为`Invoke-Command` cmdlet提供远程服务器。前面讨论过,要使用`New-PSSession` cmdlet为每台机器创建持久会话,然后将所有会话作为数组传递给`-Session`参数。这样还能隔离未能建立连接的特定机器,以便单独修复。 创建远程会话数组时,要确保只将成功的连接添加到数组中。若将未连接的会话添加到数组,再将该数组传递给`Invoke-Command`,会出错且远程服务器上不会运行任何命令。为防止这种情况,可将`New-PSSession`命令包装在`try/catch`中,并将`-ErrorAction`参数设置为`Stop`。若`New-PSSession`出现错误,脚本将自动跳转到`catch`块,跳过`try`块中的其他所有行: ```powershell try{ $session = New-PSSession -ComputerName $s -ErrorAction Stop $Sessions.Add($session) } catch{ Write-Host "$($s) failed to connect: $($_)" } ``` 控制脚本的最后一步是添加用于收集所有返回数据的列表以及CSV导入和导出。 整个过程的最后一步是关闭远程会话。使用`New-PSSession` cmdlet创建会话后,该会话会在本地客户端和远程服务器上保持活动状态,使用`Remove-PSSession` cmdlet可关闭会话,释放远程服务器的资源并关闭两台机器之间的连接。 以下是一个使用WSMan远程操作对远程计算机执行本地脚本的示例: ```powershell $servers = 'Svr01', 'Svr02', 'Svr03' # 要连接的服务器数组 $CsvFile = 'P:\Scripts\VSCodeExtensions.csv' # 保存结果的路径 $ScriptFile = 'P:\Scripts\Get-VSCodeExtensions.ps1' # 脚本文件路径 $ConnectionErrors = "P:\Scripts\VSCodeErrors.csv" # 记录连接错误的另一个CSV文件 if (Test-Path -Path $CsvFile) { # 检查CSV文件是否存在 $csvData = Import-Csv -Path $CsvFile | Select-Object -ExpandProperty PSComputerName -Unique $servers = $servers | Where-Object { $_ -notin $csvData } } [System.Collections.Generic.List[PSObject]] $Sessions = @() foreach ($s in $servers) { # 连接到每台服务器并将会话添加到$Sessions数组列表 $PSSession = @{ ComputerName = $s } try { $session = New-PSSession @PSSession -ErrorAction Stop $Sessions.Add($session) } catch { [pscustomobject]@{ # 将任何错误添加到连接错误CSV文件 ComputerName = ```
corwn 最低0.47元/天 解锁专栏
赠100次下载
点击查看下一篇
profit 百万级 高质量VIP文章无限畅学
profit 千万级 优质资源任意下载
profit C知道 免费提问 ( 生成式Al产品 )

李_涛

知名公司架构师
拥有多年在大型科技公司的工作经验,曾在多个大厂担任技术主管和架构师一职。擅长设计和开发高效稳定的后端系统,熟练掌握多种后端开发语言和框架,包括Java、Python、Spring、Django等。精通关系型数据库和NoSQL数据库的设计和优化,能够有效地处理海量数据和复杂查询。
最低0.47元/天 解锁专栏
赠100次下载
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
C知道 免费提问 ( 生成式Al产品 )

最新推荐

项目中的单元测试实践与考量

### 项目中的单元测试实践与考量 #### 1. 测试代码示例与Mockito 在测试中,我们常常会遇到需要验证结果的情况。以下是一段示例代码: ```java List<BooleanAnswer> answers = new ArrayList<>(); answers.add(new BooleanAnswer(1, true)); answers.add(new BooleanAnswer(2, true)); Map<Integer, String> questionText = stats.questionText(answers); Map<Integer, String>

Timekeeper应用剖析:DWR、Hibernate与ExtJS的协同之力

# Timekeeper 应用剖析:DWR、Hibernate 与 Ext JS 的协同之力 ## 1. getUserByID() 方法解析 `getUserByID()` 方法与 `getUserByName()` 方法极为相似,除了 HQL 查询稍有不同,以及使用 `setLong()` 替代 `setString()` 之外,二者基本一致。以下是 `getUserByID()` 方法的代码: ```java @RemoteMethod public User getUserByID(final Long inID) throws Exception { if (log.isT

分布式调度算法与互联网任务计算优化

# 分布式调度算法与互联网任务计算优化 ## 1. 新型分布式调度算法:SERH 与 Chandy - Misra 算法对比 ### 1.1 消息交换情况 在分布式系统中,SERH 算法和 Chandy - Misra 算法在消息交换方面存在显著差异。这里涉及到几个关键概率参数: - \(pr\) 和 \(ph\):取值范围为 \(0 < pr, ph ≤ 1\)。 - \(pw\):表示运行节点决定唤醒休眠相邻节点的概率,取值范围是 \(0 < pw ≤ 1\)。同时,为防止算法全局终止,当节点的所有邻居都处于休眠(H - state)状态时,该节点不能进入 H - state。 通过图

JavaCDI:拦截器与动态Bean的使用指南

# Java CDI:拦截器与动态 Bean 的使用指南 ## 1. 应用拦截器 在编写完拦截器后,就需要应用该拦截器。通常可以通过使用注解标注单个方法或整个类来应用拦截器。当对类进行注解时,拦截器将对该类的每个公共方法进行调用,但前提是这些方法是通过 Bean 代理调用的,这意味着 Bean 内部的任何内部调用都不会被拦截。 应用拦截器有两种方式: - **使用通用注解**:这是最简单的方法,可通过应用 `javax.interceptor.Interceptors` 注解来实现。该注解的值是一个拦截器类的数组,拦截器类在拦截器链中的执行顺序由它们的声明顺序决定。 ```java @In

Struts与Ajax:技术融合与应用部署全解析

# Struts与Ajax:技术融合与应用部署全解析 ## 1. Ajax技术概述 ### 1.1 Ajax简介 Ajax(Asynchronous JavaScript and XML)由Jesse James Garrett在2005年提出。它并非单一技术,而是一系列概念和技术的集合,能让用户与Web应用进行更丰富、更具交互性的操作。如今,Ajax泛指所有允许与后端服务器进行异步通信的原生浏览器技术。其核心概念是,当网页的一部分发生变化时,无需刷新整个页面。例如,在选择国家下拉列表后,相应的州下拉列表会自动填充。 ### 1.2 Ajax的基础技术 Ajax基于JavaScript,主

高性能计算与医学图像重建的并行化探索

### 高性能计算与医学图像重建的并行化探索 在高性能计算领域,不同的编程语言和架构在实现并行化方面各有优劣。同时,在医学图像重建领域,为了提高效率和质量,并行化也变得至关重要。本文将探讨高性能计算中的相关语言和架构,以及医学图像重建中算法的并行化实现。 #### 高性能计算中的语言与架构 在高性能计算中,SaC 语言展现出了独特的优势。SaC 是一种函数式、单赋值语言,其编译器能够进行一些特定的优化。这些优化可以将数组上的许多小操作合并为更少的大操作,从而让程序更高效地扩展。与之相比,像 Fortran 这样的过程式编程语言,编译器往往难以完全详细地分析数据依赖关系,因此无法实现类似的优

构建AF-客户端管理器应用:Flex、Spring、Cairngorm与Hibernate的集成

### 构建 AF - 客户端管理器应用:Flex、Spring、Cairngorm 与 Hibernate 的集成 #### 1. 项目概述 在开发软件时,通常需要先掌握各个技术的单独方面,再将它们整合起来,形成完整的解决方案。AF - 客户端管理器应用就是这样一个将 Flex、Spring、Cairngorm 和 Hibernate 等技术整合在一起的项目。该项目旨在为中大型企业提供一个强大的基于 Web 的客户端管理解决方案,具备管理客户账户、项目和财务等核心功能,同时作为富互联网应用(RIA)产品展示公司的技术实力。 #### 2. 项目业务需求 - **核心管理功能**:满足中大

服务器端代码剖析:游戏核心逻辑揭秘

### 服务器端代码剖析:游戏核心逻辑揭秘 在游戏开发中,服务器端代码起着至关重要的作用,它负责处理游戏的核心逻辑、管理玩家状态等。本文将深入剖析一个游戏的服务器端代码,包括核心类的功能、方法实现以及游戏逻辑的处理。 #### 客户端调用与服务器响应 客户端提供了一个 `howToPlay` 方法,用于获取游戏的玩法说明: ```javascript this.howToPlay = function() { GameCore.howToPlay( { callback : function(inResp) { alert(inResp);

迁移RafaEShop应用到OpenShift平台

### 迁移 RafaEShop 应用到 OpenShift 平台 #### 1. 准备上传应用 在相关文件夹中,除了自己的 WAR 文件外,还有一个名为 openshift 的 WAR 文件,这是使用 OpenShift 的 DIY 墨盒时生成的默认应用。完成前期步骤后,就可以将应用上传到 OpenShift 平台。不过,在提交更改之前,最好开启一个单独的进程来监控 GlassFish 应用服务器的启动和停止状态。 #### 2. 监控 GlassFish 启动/停止状态 若熟悉使用安全外壳会话进行连接以及如何从计算机打开此类连接,可使用以下命令打开 SSH 会话,实时监控 GlassF

Java网络编程与安全全解析

### Java网络编程与安全全解析 #### 1. Java简化网络编程 在过去,用任何语言编写网络应用程序都很困难,有时需要编写直接与网络驱动甚至网卡通信的专用系统软件。而Java通过封装,将复杂的底层网络编程隐藏起来,让开发者能专注于应用程序本身。Java的网络类位于`java.net`包中,这些类让编写互联网、企业内部网甚至局域网的通信程序变得比其他语言更简单。 Java的网络类使用流进行底层通信。流是信息源和目的地之间的通信路径,根据程序处于流的哪一端,可分为输出流和输入流。读者和写入器与流类似,但流基于字节,而读者和写入器基于字符。流、读者和写入器都属于`java.io`包。