本文提供了对订阅内的 Windows 经典部署虚拟机和资源管理器部署虚拟机执行批量安装并配置 Microsoft Anti-Malware 扩展的 PowerShell 脚本。

关于安装 Windows 虚拟机扩展的先决条件,请参考 适用于 Windows 的虚拟机扩展和功能

准备扩展的配置

请将配置根据格式储存成 .json 文件或 .xml 文件。如需更改配置内容,请参照后文的配置字段说明。

Json 格式样例

复制
{
"AntimalwareEnabled": true,
"RealtimeProtectionEnabled": true,
"ScheduledScanSettings": {
"isEnabled": true,
"day": 7,
"time": 120,
"scanType": "Quick"
},
"Exclusions": {
"Extensions": ".ext1;.ext2",
"Paths": "c:\\excluded-path-1;c:\\excluded-path-2",
"Processes": "excludedproc1.exe;excludedproc2.exe"
}
}

XML 格式样例

复制
<AntimalwareConfig>
<AntimalwareEnabled>true</AntimalwareEnabled>
<RealtimeProtectionEnabled>true</RealtimeProtectionEnabled>
<ScheduledScanSettings isEnabled="true" day="7" time="120" scanType="Quick"/>
<Exclusions>
<Extensions>
<Extension>.ext1</Extension>
<Extension>.ext2</Extension>
</Extensions>
<Paths>
<Path>c:\excluded-path-1</Path>
<Path>c:\excluded-path-2</Path>
</Paths>
<Processes>
<Process>excludedproc1.exe</Process>
<Process>excludedproc2.exe</Process>
</Processes>
</Exclusions>
<Monitoring>ON</Monitoring>
<StorageAccountName>contosostorage</StorageAccountName>
</AntimalwareConfig>

配置字段说明

PowerShell 脚本

预定义订阅号、储存 Anti-Malware 扩展日志的存储账号和本地电脑上 .json 配置文件的存放位置。以下信息按实际环境配置。

复制
$subscriptionid = "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
$diagstorageaccountname = "xxxxxxxxx"
$configPath = "C:\Users\Desktop\antimalware.json"

通过 PowerShell 登陆 Azure

复制
$cred = Get-Credential
Import-Module azure
Import-Module azurerm.profile
Add-AzureAccount -Environment azurechinacloud -Credential $cred
Login-AzureRmAccount -EnvironmentName azurechinacloud -Credential $cred
Get-AzureSubscription -SubscriptionId $subscriptionid | Select-AzureSubscription
Get-AzureRmSubscription -SubscriptionId $subscriptionid | Select-AzureRmSubscription

抓取经典部署 Windows 虚拟机并安装扩展

复制
#Grab all classic VMs from subscription
$classicVM = Get-AzureVM
$classicVMnum = $classicVM.count
#specify storage context to store monitoring events
$StorageContext = New-AzureStorageContext -StorageAccountName $diagstorageaccountname -StorageAccountKey (Get-AzureStorageKey -StorageAccountName $diagstorageaccountname).Primary
#Install antimalware extension for all classic Windows VMs that are in started status
For ($i=0; $i -lt $classicVMnum; $i++) {
if (($classicVM[$i].Status -eq "ReadyRole") -and ($classicvm[$i].VM.OSVirtualHardDisk.OS -eq "Windows")) {
$ifinstalled = $null;
$ifinstalled = Get-AzureVMMicrosoftAntimalwareExtension -vm $classicvm[$i];
if ($ifinstalled -eq $null) {
$result = Set-AzureVMMicrosoftAntimalwareExtension -VM $classicVM[$i] -AntimalwareConfigFile $configPath -Monitoring ON -StorageContext $StorageContext | Update-AzureVM
Write-Host "The installation of anti-malware for VM" $classicVM[$i].InstanceName "in cloud service" $classicVM[$i].ServiceName $result.OperationStatus
} else {
Write-Host "VM" $classicVM[$i].InstanceName "in cloud service" $classicVM[$i].ServiceName "already has anti-malware plugin installed"
}
}
}

抓取资源管理器部署 Windows 虚拟机并安装扩展

复制
#Grab all ARM VMs
$ARMVM = Get-AzureRmVM
$ARMVMnum = $ARMVM.Count
#read configuration string from json file
$settingString = [IO.File]::ReadAllText($configPath); #get latest version from extension info
$allversions = @((Get-AzureRmVMExtensionImage -Location "chinaeast" -PublisherName "Microsoft.Azure.Security" -Type "IaaSAntimalware").Version)
$versionstring = $allVersions[($allVersions.count)-1].Split(".")[0] + "." + $allVersions[($allVersions.count)-1].Split(".")[1] #Install antimalware extension for all ARM Windows VMs that are in started status, except windows2016.
For ($j = 0; $j -lt $ARMVMnum; $j++) {
$VMstatus = Get-azurermvm -Name $ARMVM[$j].Name -ResourceGroupName $ARMVM[$j].ResourceGroupName -status
if (($VMstatus.Statuses[1].Code -eq "PowerState/running") -and ($ARMVM[$j].StorageProfile.OsDisk.OsType -eq "Windows") -and ($ARMVM[$j].StorageProfile.ImageReference.Sku -notlike "2016-*")) {
$ifinstalled = $null;
$ifinstalled = Get-AzureRmVMExtension -ResourceGroupName $ARMVM[$j].ResourceGroupName -VMName $ARMVM[$j].Name -Name "IaaSAntimalware" -ErrorAction SilentlyContinue
if ($ifinstalled -eq $null) {
$result = Set-AzureRmVMExtension -ResourceGroupName $ARMVM[$j].ResourceGroupName -VMName $ARMVM[$j].Name -Location $ARMVM[$j].Location -Name "IaaSAntimalware" -Publisher "Microsoft.Azure.Security" -ExtensionType "IaaSAntimalware" -TypeHandlerVersion $versionstring -SettingString $settingString
Write-Host "The installation of anti-malware for VM" $ARMVM[$j].Name "in resource group" $ARMVM[$j].ResourceGroupName "was" $result.StatusCode "with reason" $result.ReasonPhrase
} else {
Write-Host "VM" $ARMVM[$j].Name "in resource group" $ARMVM[$j].ResourceGroupName "already has anti-malware plugin installed"
}
}
}

此示例脚本的限制

  1. 请用户先在非生产环境中测试此脚本,确认可用且无其他问题后再部署到生产环境中。
  2. Anti-Malware 扩展不兼容 Windows Server 2016,原因是新一代系统自带 Windows Defender,功能与 Anti-Malware 扩展冲突,导致安装失败。
  3. 由于 Azure VM 磁盘属性的限制,经典部署模式的命令无法判别虚拟机的操作系统是否是 Windows Server 2016,所以经典部署下的 Windows Server 2016 执行此脚本时会报错。
  4. 如果虚拟机曾经做过从经典部署模式迁移到资源管理器部署模式的操作,由于迁移后资源管理器虚拟机磁盘属性仍然会继承之前经典部署虚拟机的磁盘属性,资源管理器部署部分的脚本无法判别迁移后虚拟机的磁盘属性。
  5. 经典部署模式的命令支持将 Anti-Malware 扩展扫描时生成的 Windows Event Log 转存到 Azure 存储账户中,而资源管理器部署模式的命令不含此配置,所以无法做到 Event Log 的转存。

查询 Anti-Malware 扩展的安装状态

可以使用以下命令来查询 Anti-Malware 扩展的状态和配置:

  • 经典部署模式

    复制
      Get-AzureVM -ServiceName "ServiceName" -Name "VMname" | Get-AzureVMMicrosoftAntimalwareExtension

    输出:

  • 资源管理器部署模式

    复制
      Get-AzureRmVMExtension -ResourceGroupName "ResourceGroupName" -VMName "VMName" -Name "IaaSAntimalware"

    输出:

System Center Endpoint Protection 错误解决方法

在虚拟机内打开 System Center Endpoint Protection 时会弹出 “你的系统管理员已限制访问此应用” 的错误:

进入指定目录执行以下命令 :

复制
C:\Program Files\Microsoft Security Client> ConfigSecurityPolicy.exe cleanuppolicy.xml            立即访问http://market.azure.cn

为订阅内虚拟机批量安装并配置 Microsoft Anti-Malware 扩展的更多相关文章

  1. VMware 虚拟机图文安装和配置 AlmaLinux OS 8.6 教程

    前言: 这是<VMware 虚拟机图文安装和配置 Rocky Linux 8.5 教程>一文的姐妹篇教程,如果你需要阅读它,请点击这里. 2020 年,CentOS 宣布:计划未来将重心从 ...

  2. 必须使用“角色管理工具”安装或配置Microsoft .NET Framework 3.5 SP1

    在Windows Server 2008下直接安装SQL Server 2008时,会出现如下错误: 必须使用“角色管理工具”安装或配置Microsoft .NET Framework 3.5 SP1 ...

  3. 解决【必须使用“角色管理工具”安装或配置Microsoft .NET Framework 3.5 SP1】的方法

    [摘要:正在Windows Server 2008下间接装置SQL Server 2008时,会涌现以下毛病: 必需应用“脚色治理对象”装置或设置装备摆设Microsoft .NET Framewor ...

  4. windows Server 2008 -必须使用“角色管理工具”安装或配置Microsoft .Net Framework 3.5

    在windows Server 2008上安装 .Net Framework 3.5的时候,报错:必须使用“角色管理工具”安装或配置Microsoft .Net Framework 3.5. Solu ...

  5. 必须使用角色管理工具 安装或配置microsoft.net framework 3.5

    windows server 2008安装sql server 2012后报错,要求安装microsoft.net framework 3.5 sp1 但安装时提示,必须使用角色管理工具 安装或配置m ...

  6. VMware 虚拟机图文安装和配置 Rocky Linux 8.5 教程

    前言 2020 年,CentOS 宣布:计划未来将重心从 CentOS Linux 转移到 CentOS Stream.CentOS 8 的生命周期已于 2021 年 12 月 31 日终止,而 Ce ...

  7. Hadoop集群--linux虚拟机Hadoop安装与配置、克隆虚拟机

    Hadoop集群 第四章 Hadoop安装与配置.克隆虚拟机 一.Hadoop安装与配置 1.将hadoop安装包通过Xftp传输到虚拟机的/software目录下 2.进入/software目录下, ...

  8. 在hyper-v虚拟机中安装并配置linux

    虽然都是自己写的,还是贴个原文链接吧,如果文章里的图片错乱了,可能就是我贴错了,去看原文吧. 多图警告 WSL2真香? WSL2相比于WSL1前者更类似于虚拟机,配合上Windoes Terminal ...

  9. nginx + php + mysql安装、配置、自启动+redis扩展

    用过了apache就想着用用nginx,网上教程其实很多,但是受服务器版本等限制,每个人遇到的问题也不一样,先记录下我的 一.安装依赖 yum -y install gcc zlib zlib-dev ...

随机推荐

  1. 用Akka构建一个简易的分布式文件系统

    本来初期打算用Hadoop 2,可是后来有限的服务器部署了Solr Cloud,各种站点,发现资源不够了,近10T的文件,已经几乎把服务器的磁盘全部用光.想来想去,由于目前架构基于Scala的,所以还 ...

  2. 【数组】Unique Paths

    题目: A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). ...

  3. android常用Linux命令

    安卓下面有个软件叫终端模拟器,其实就是Linux下的命令行,使用这些命令能有效处理问题. 1.基本知识 “/”,这个英文字母斜杠指的是根目录,类似Windows的C:\,但是Linux下只有一个根目录 ...

  4. 21.Decorator修饰器

    1.类的修饰 2.方法的修饰 3.为什么修饰器不能用于函数? 4.core-decorators.js 5.使用修饰器实现自动发布事件 6.Mixin 7.Trait 8.Babel转码器的支持

  5. eclipse添加dtd约束和xml约束的方法

    struts-2.3.dtd dtd 文件的位置 导入上面的 dtd 约束 spring-beans-4.2.xsd 为主配置文件引入新的命名空间(约束)

  6. oracle 数据库添加Java方法

    create or replace and compile java source named "Bitconverter" aspublic class Bitconverter ...

  7. [转]Format a ui-grid grid column as currency

    本文转自:https://stackoverflow.com/questions/27747184/format-a-ui-grid-grid-column-as-currency-rc-3-0 Yo ...

  8. vs2015编译时CS1056 C# Unexpected character解决办法

    https://stackoverflow.com/questions/42932577/error-cs1056-unexpected-character-running-the-msbuild-o ...

  9. 后台UI模板开发规范

    AdminLTE模板 在接触新模板之前,需要对bootstrap有初步了解,文档戳这里  主要是了解有哪些控件.样式.元素 可以直接follow使用(形成需要什么的时候直接去查文档的意识,而不是都自己 ...

  10. 时间复杂度为O(logN)的常用算法

    时间复杂度为O(logN)的常用算法 折半查找 /* * 折半查找 * 默认查找的数组已经排过序 */ public static int binarySearch(int[] a,int x){ i ...