我正在尝试重命名主机名并将其添加到竞价型实例的AD。这是一个简单的powershell脚本。我已经阅读了文档,默认情况下,一次执行后,用户数据将被禁用;如果使用<persist>true</persist>
,则不会被禁用。
我想我看到某个地方(每次启动都可以运行)是通过taskscheduler完成的,但是找不到链接。
有人满足我的if
条件后,可以将我指向任务计划程序作业还是手动禁用用户数据的方法。
<powershell>
Set-ExecutionPolicy unrestricted -Force
$instanceName = "test-name5"
$username = "domain\username"
$password = "password" | ConvertTo-SecureString -AsPlainText -Force
$cred = New-Object -typename System.Management.Automation.PSCredential($username, $password)
Start-Sleep -s 5
$hostname = hostname
$domain = (Get-WmiObject win32_computersystem).Domain
if (!($hostname -eq $instanceName)){
Rename-Computer -NewName $instanceName -restart -force
}Elseif (!($domain -eq 'my.domain.local')){
Start-Sleep -s 5
Add-Computer -DomainName my.domain.local -OUPath "OU=Windows,OU=QAServers,OU=Servers,DC=my,DC=domain,DC=local" -Credential $cred -Force -Restart -erroraction 'stop'
}Else {
####code to disable the running of userdata once above conditions
are met####
}
</powershell>
<persist>true</persist>
答案 0 :(得分:1)
正如我在上一个答案的评论中所说,我有3个选择,并且由于找到了aws计划任务,因此我选择了最后一个选择。回答我自己的问题,因为很容易找到代码。
<powershell>
Set-ExecutionPolicy unrestricted -Force
#Enter instance hostname here
$instanceName = "test-name8"
$username = "domain\username"
#Using ssm parameter store to avoid having the password in plaintext
$password = (Get-SSMParameterValue -Name AD-Password -WithDecryption $True -Region us-east-1).Parameters[0].Value | ConvertTo-SecureString -asPlainText -Force
Start-Sleep -s 3
$cred = New-Object -typename System.Management.Automation.PSCredential($username, $password)
Start-Sleep -s 5
$hostname = hostname
$domain = (Get-WmiObject win32_computersystem).Domain
if ($hostname -ne $instanceName){
Rename-Computer -NewName $instanceName -restart -force
}Elseif ($domain -ne 'my.domain.local'){
Start-Sleep -s 5
Add-Computer -DomainName my.domain.local -OUPath "OU=Windows,OU=QAServers,OU=Servers,DC=my,DC=domain,DC=local" -Credential $cred -Force -Restart -erroraction 'stop'
}Else {
Disable-ScheduledTask -TaskName "Amazon Ec2 Launch - Userdata Execution"
Unregister-ScheduledTask -TaskName "Amazon Ec2 Launch - Userdata Execution"
}
</powershell>
<persist>true</persist>
注意:启动服务器时必须附加具有ssm策略的角色,此ssm parameter命令才能起作用。
答案 1 :(得分:0)
值得一读ec2config-service文档,因为其中引用了您想要的设置。
您需要Ec2HandleUserData
中配置的Config.xml
。
Powershell可以轻松更新此设置:
$path = 'C:\Program Files\Amazon\Ec2ConfigService\Settings\config.xml'
$xml = [xml](Get-Content $path)
$state = $xml.Ec2ConfigurationSettings.Plugins.Plugin | where {$_.Name -eq 'Ec2HandleUserData'}
$state.State = 'Disabled'
$xml.Save($path)
我在创建自定义AMI时使用此代码来重新启用用户数据处理($state.State = 'Enabled'
)。
编辑:以上内容适用于ec2config
而不是ec2launch
,这是OP所使用的。我本来想念这个的。
在这种情况下,我认为您需要更改脚本的运行方式,而不是使用<persist>
,然后尝试禁用其功能,我将删除persist标签并调用InitializeInstance.ps1 –Schedule
({{ 3}})中的if
中,您希望用户数据重新运行的条件:
if ($hostname -ne $instanceName) {
& C:\ProgramData\Amazon\EC2-Windows\Launch\Scripts\InitializeInstance.ps1 -Schedule
Rename-Computer -NewName $instanceName -Restart -Force
}
elseif ($domain -ne 'my.domain.local') {
& C:\ProgramData\Amazon\EC2-Windows\Launch\Scripts\InitializeInstance.ps1 -Schedule
Add-Computer -DomainName aws.macmillan.local -OUPath "OU=Windows,OU=QAServers,OU=Servers,DC=my,DC=domain,DC=local" -Credential $cred -Force -Restart -ErrorAction 'stop'
}