本文提供了对订阅内的 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. JS框架设计之对象扩展一种子模块

    对象扩展 说完了,对象的创建(框架的命名空间的创建)以及如何解决多库之间的命名空间冲突问题之后,接下来,就是要扩展我们的对象,来对框架进行扩展,我们需要一种新功能,将新添加的功能整合到我们定义的对象中 ...

  2. Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. 调用函数约定不同

    Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call.  This is ...

  3. Linux网络编程--多线程实现echo服务器与客户端“一对多”功能,是网络编程的“Hello World!”

    在linux平台下,用多线程实现echo服务器与客户端“一对多”(即是一台服务器可以响应多个客户端的请求).本人写了个demo,和大家一起分享,有不足的地方,请多多指教,我是壮壮熊. 编译时,在后面加 ...

  4. PTA (Advanced Level) 1014 Waiting in Line

    Waiting in Line Suppose a bank has N windows open for service. There is a yellow line in front of th ...

  5. 3行代码,为QQ轻游戏加上语音互动能力

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯游戏云 发表于云+社区专栏 游戏和社交往往有着密不可分的关系,QQ轻游戏就是一款集成在手Q里面的游戏平台,直接通过手Q入口就能随开 ...

  6. PHP OOP面向对象部分方法归总(代码实例子)

    <?php//对象名存在栈内存中,数据存在堆内存中class leyangjun{    var $name;  //定义变量    var $age;    var $sex;         ...

  7. 仿淘宝商品详情页上拉弹出新ViewController

    新项目就要开始做了,里面有购物那块,就试着先把淘宝商品详情页的效果做了一下. 1.需求 1.第一次上拉时,A视图拉到一定距离将视图B从底部弹出,A视图也向上 2.显示B视图时下拉时,有刷新效果,之后将 ...

  8. spring security认证

    1 开发基于表单的认证 Spring security核心的功能 认证(你是谁?) 授权(你能干什么?) 攻击防护(防止伪造身份) spring security实现了默认的用户名+密码认证,默认用户 ...

  9. 阿里云服务器(Ubuntu16.04 64位)远程连接

    购买阿里云服务器 1.打开阿里云官方网站,账号登录,选择产品中的云服务器 ECS 2.根据自身需求,选择合适的阿里云服务器系统,(1)点击一键购买,(2)选择地域,(3)根据自身需求,选择系统,这里选 ...

  10. [javaSE] IO流(管道流)

    之前我们使用io流,都是需要一个中间数组,管道流可以直接输入流对接输出流,一般和多线程配合使用,当读取流中没数据时会阻塞当前的线程,对其他线程没有影响 定义一个类Read实现Runable接口,实现r ...