我的问题有点复杂,所以我将从 context 的简短解释开始 . 目标是:
-
在Google Cloud Platform上创建新的Windows实例
-
避免使用gcloud命令行sdk而是使用(REST)API
-
通过powershell(而不是rdp)连接到VM
Problem
没有API来创建新的Windows帐户和密码,就像gcloud命令行一样:
gcloud compute reset-windows-password
但是当然需要用户连接到vm .
My ideas
我尝试使用创建新用户的启动脚本 . powershell脚本已经在正在运行的计算机上以预期的方式工作(作为管理员):
$ADSIComp =[adsi]"WinNT://test-remote"
$NewUser = $ADSIComp.Create('User','test')
$NewUser.SetPassword(('S€cur3P@ssword'))
$NewUser.SetInfo()
$Group = [ADSI]"WinNT://test-remote/Administrators,group"
$Group.Add("WinNT://test,user")
Google Cloud 提供了不同类型的启动脚本(see here) . 我尝试使用sysprep-specialize-script-ps1,所以它只运行一次 . (它是否正确?) . 为了测试这是否有效,我在Google Cloud 仪表板上创建了一个新的Windows实例 . 在元数据部分中,我将sysprep-specialize-script-ps1作为metakey插入,并将括号中的脚本行作为值插入 .
Result
我在仪表板上创建了一个新用户,以便在Windows机器上登录 . 但是上面的脚本没有创建用户 . 所以我的方法失败了 .
Open Questions
你能否在我的过程中看到(概念上的或技术上的)错误?
有没有其他方法可以达到指定的目标?
谢谢!
1 回答
您可以查看Python/Java example provided here,它允许您使用Google Cloud Client库为Windows VM生成新密码并实际在本地打印 .
这个过程是这样的:
您可以选择您传递的用户名 .
传入用于加密的RSA密钥对的公钥 . 您在本地保留RSA密钥对的私钥 .
使用步骤1和2中提到的信息覆盖VM上的
windows-keys
元数据 .加密密码打印到COM4串口 .
然后,您拉出加密密码并在您的计算机上本地解密 .
对于updating an instance's metadata以及reading an instance's Serial port output,Compute Engine APIs . 我之前使用客户端库指出的示例使用这些API .
因此,您可以使用客户端库构建脚本/应用程序,也可以直接调用上面提到的API .
重新发明轮子
由于我不知道您为什么要避免使用
gcloud
的确切原因,我想指出使用REST API的客户端库的手动方式基本上执行与方便的gcloud compute reset-windows-password
命令完成的完全相同的步骤 .换句话说,你可能会在这里重新发明轮子 . 执行此操作有合法的情况,例如您希望将此逻辑添加到应用程序中,并且不希望调用外部程序来执行此操作 . 如果您只打算将其用作脚本的一部分,我建议重用
gcloud
,除非有强烈的反对使用它 .