我正在使用.NET SDK,并希望获取Windows密码。

我已阅读此文档,并根据Java示例编写了代码。

但是,在执行SetMetadataRequest ,我在串行端口1上遇到了此错误,而我在串行端口4上无法获得加密密码。

-------------------设置元数据时的错误消息-------------------------- ------

" 2019/09/16 12:28:36 GCEWindowsAgent:错误account.go:275:无效字符':' 最高价值后”

我的代码是:

using Google.Apis.Auth.OAuth2;
using Google.Apis.Compute.v1;
using Google.Apis.Compute.v1.Data;
using Google.Apis.Services;
using java.math;
using java.security;
using java.security.spec;
using java.util;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;

namespace GoogleHelper
{
    internal class GoogleVmHelper : VmTaskInterface
    {

        private ComputeService _Client;

        public async Task<bool> SetMetadata()
        {

// //---after instantiate of ComputeService _Client////

            InstancesResource.GetRequest describeServerReq = _Client.Instances.Get("projectid", "region", "serverid");
            Data.Instance describeServerRes = await describeServerReq.ExecuteAsync();
            Metadata oldMetaData = describeServerRes.Metadata;

            // Generate the public/private key pair for encryption and decryption.
            KeyPair keys = generateKeys();
            var buildedKeys = buildKeyMetadata(keys);

            //Replace Metadata
            string newItemString = buildedKeys.ToString();

            // Get the list containing all of the Metadata entries for this instance.
            var items = oldMetaData.Items;

            // If the instance has no metadata, items can be returned as null.
            if (items == null)
            {
                items = new List<Metadata.ItemsData>();
                oldMetaData.Items = items;
            }

            // Find the "windows-keys" entry and update it.
            bool isFound = false;
            foreach (var item in items)
            {
                if (item.Key == "windows-keys")
                {
                    // Replace item's value with the new entry.
                    // To prevent race conditions, production code may want to maintain a
                    // list where the oldest entries are removed once the 32KB limit is
                    // reached for the metadata entry.
                    item.Value = newItemString;
                    isFound = true;
                    break;
                }
            }

            if (!isFound)
            {
                // "windows.keys" entry doesn't exist in the metadata - append it.
                // This occurs when running password-reset for the first time on an instance.
                var addItem = new Metadata.ItemsData();
                addItem.Key = "windows-keys";
                addItem.Value = newItemString;
                items.Add(addItem);
            }

            oldMetaData.Items = items;

            //Set Metadata
            var setMetadataReq = new InstancesResource.SetMetadataRequest(_Client, oldMetaData, _Profile.ProjectID, _Task.Region, _Task.ServerID);
            var serMEtaDataRes = await setMetadataReq.ExecuteAsync();

            await System.Threading.Tasks.Task.Delay(30000);

            //GetPassword
            var getSerialPortOutputReq = new InstancesResource.GetSerialPortOutputRequest(_Client, _Profile.ProjectID, _Task.Region, _Task.ServerID);
            getSerialPortOutputReq.Port = 4;
            var getSerialPortOutputRes = await getSerialPortOutputReq.ExecuteAsync();

            //EMPTY EMPTY EMPTY EMPTY EMPTY EMPTY EMPTY EMPTY EMPTY EMPTY EMPTY EMPTY EMPTY EMPTY EMPTY EMPTY EMPTY EMPTY
            var entries = getSerialPortOutputRes.Contents;
            //EMPTY EMPTY EMPTY EMPTY EMPTY EMPTY EMPTY EMPTY EMPTY EMPTY EMPTY EMPTY EMPTY EMPTY EMPTY EMPTY EMPTY EMPTY

            return true;
        }


        private KeyPair generateKeys()
        {
            KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");

            // Key moduli for encryption/decryption are 2048 bits long.
            keyGen.initialize(2048);

            return keyGen.genKeyPair();
        }

        private JObject jsonEncode(KeyPair keys)
        {
            KeyFactory factory = KeyFactory.getInstance("RSA");

            // Get the RSA spec for key manipulation.
            RSAPublicKeySpec pubSpec = factory.getKeySpec(keys.getPublic(), typeof(RSAPublicKeySpec)) as RSAPublicKeySpec;

            // Extract required parts of the key.
            BigInteger modulus = pubSpec.getModulus();
            BigInteger exponent = pubSpec.getPublicExponent();

            // Strip out the leading 0 byte in the modulus.
            byte[] arr = Arrays.copyOfRange(modulus.toByteArray(), 1, modulus.toByteArray().Length);

            JObject returnJson = new JObject();

            // Encode the modulus, add to returned JSON object.
            String modulusString = Convert.ToBase64String(arr).Replace("\n", "");
            returnJson.Add("modulus", modulusString);

            // Encode exponent, add to returned JSON object.
            String exponentString = Convert.ToBase64String(exponent.toByteArray()).Replace("\n", "");

            returnJson.Add("exponent", exponentString);

            return returnJson;
        }


        private JObject buildKeyMetadata(KeyPair pair)
        {
            // Encode the public key into the required JSON format.
           var metadataValues =  jsonEncode(pair);

            // Add username and email.
            metadataValues.Add("userName", "myusername");
            metadataValues.Add("email", "myemal");

            //Create the date on which the new keys expire.
            //DateTime now = new DateTime();
            var expiredDate = DateTime.Now + TimeSpan.FromMinutes(5);

            //Format the date to match rfc3339.
            DateTime utcTime = System.TimeZoneInfo.ConvertTimeToUtc(expiredDate);
            String dateString = utcTime.ToString("yyyy-MM-dd'T'HH:mm:ss'Z'");
            //Encode the expiration date for the returned JSON dictionary.
            metadataValues.Add("expireOn", dateString);

            return metadataValues;
        }

    }    
}

  ask by user11193991 translate from so

本文未有回复,本站智能推荐:

1回复

在GCP中停止VM并等待它使用gcppythonsdk停止

我想在 gcp 中停止 VM 并等待该过程完成。 现在如果我打 它不等待虚拟机实际处于停止状态就退出。
2回复

curl:(56)在GCPSDK中失败,但在VM中没有

目标我想将一个大型 zip 文件从在线数据库下载到 GCP 存储桶中。 我对 GCP 和在终端中工作的技术不是很熟练,而且我偶然发现了一些我无法解决的问题。 我试过的我尝试以几种不同的方式执行上述操作。 首先我在 GCP 的云 shell 中尝试了以下命令: curl -O https://webs
1回复

gcp是否提供sdk支持,以获取iam用户,服务帐户及其所附角色的列表?

我最好需要Java软件开发套件。 该图显示了如何在console中查看所需的数据。我希望通过软件开发套件获得相同的数据
2回复

错误:(gcloud.auth.print-identity-token)无法从当前凭据中获取身份令牌

在 gcloud 会话中,我试图执行一个我通常没有任何问题的 bash 脚本,但今天我收到以下错误:错误:(gcloud.auth.print-identity-token)没有身份令牌可以从当前凭据中获取我为解决此问题而遵循的步骤: 运行gcloud auth list结果:能够查看并确认我的帐
1回复

使用gosdk在GCP中获取项目所属的组织

我列出我的项目如下:listProjectsResponse, err := projectsListCall.Do() 其中projectsListCall是由cloudresourcemanager及其v1beta1 API 提供的类型。 虽然我找不到能够检索项目所属Organization的方
1回复

在Windows上安装GoogleCloudSDK失败

尝试使用在线和离线安装在 Windows 2016 机器上安装 Google SDK。 在这两种情况下,安装都失败并显示以下错误。 机器在防火墙后面。 错误:(gcloud.components.update) 无法从服务器获取组件列表。 检查您的网络设置,然后重试。
1回复

DataflowSDK2.7.0同时附加设置2.10.0

我正在尝试运行数据流作业,具有以下 setup.py 文件: 但是当我将作业提交给 GCP 时,SDK 显示为 2.7.0 并且该作业不会运行。 它将在 1 小时后停止并出现以下错误: 工作流失败。 原因:Dataflow 作业似乎卡住了,因为在过去 1 小时内没有看到任何工作程序活动。
1回复

在Windows10上安装GoogleCloudSDK失败

当我尝试安装 Google Cloud SDK 时,它失败了: 欢迎使用 Google Cloud SDK! 要使用 Google Cloud SDK,您必须在 PATH 上安装 Python。 作为替代方案,您还可以将 CLOUDSDK_PYTHON 环境变量设置为 Python 可执行文件的位