我想要完成的任务:
过去几天我一直在努力将自动化应用到我公司的GoogleApps设置中。我需要暂停已停用超过90天的用户,并在一周之后删除它们。在删除之前,我需要备份其Google云端硬盘中的所有文件。
为什么我还没有完成它:
我尝试过几种不同的方法。首先,我使用Admin SDK与DirectoryServices连接,列出用户,并根据需要暂停。这种接口还允许我在需要时删除用户。现在,我只需要备份他们的Google云端硬盘文件。为此,根据我的理解,我需要一个服务帐户来模拟用户,下载他们的文件,并重新定位它们(可能在大容量存储中关闭到服务器)。我不认为这可以作为管理员以编程方式进行,因为我认为UserCredentials需要用户授权我打算通过Drive API手动与每个用户进行交互。另一方面,如果提供了适当的授权,服务帐户应允许我在未经授权的情况下冒充用户。
我创建了ServiceAccount,为其提供了Domain-Wide-Delegation,通过开发者控制台启用了相应的API(Admin SDK,Drive API),并通过Google管理控制台安全设置为服务帐户提供了适当的范围。我认为这是我需要做的所有设置。
private static async Task<bool> AuthenticateServiceAccount(string serviceAccountEmail, string keyFilePath)
{
if (!File.Exists(keyFilePath)) // make sure the file we're looking for actually exists
{
Console.WriteLine("Could not find ServAcct key file. Authentication failed!");
return false;
}
string[] scopes = new string[] { DirectoryService.Scope.AdminDirectoryUser, DriveService.Scope.Drive };
// Generate certificate using our key file
var certificate = new X509Certificate2(keyFilePath, "notasecret", X509KeyStorageFlags.Exportable);
try
{
// Create our credential from our certificate, using scopes
ServiceAccountCredential credential = new ServiceAccountCredential(
new ServiceAccountCredential.Initializer(serviceAccountEmail)
{
Scopes = scopes
}.FromCertificate(certificate));
// Create our services
dirSvc = new DirectoryService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = "GoogleAppAutomation"
});
drvSvc = new DriveService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = "GoogleAppAutomation"
});
} catch(Exception e)
{
Console.WriteLine(e.InnerException);
return false;
}
return true;
}
我可以使用SA的电子邮件和P12证书在我的代码中验证服务帐户。使用ServiceAccountCredential创建DirectoryService和DriveService对象可以正常工作。但是,当我去访问这些服务时,我遇到的错误是我找不到任何在线帮助。
目录服务
// Acquire list of active users
UsersResource.ListRequest req = dirSvc.Users.List();
req.Customer = "my_customer";
req.MaxResults = 500; // 500 is max allowed. Must use paging (.pageToken) for more
req.OrderBy = UsersResource.ListRequest.OrderByEnum.Email;
IList<User> users;
try
{
users = req.Execute().UsersValue; // Execute request for user list
}
catch (Exception e)
{
throw new Exception("User List Exception", e);
}
果然,catch块将抛出一个包含以下内容的异常:
Google.Apis.Requests.RequestError
Domain not found. [404]
Errors [
Message[Domain not found.] Location[ - ] Reason[notFound] Domain[global]
]
DriveService
FilesResource.ListRequest lr = drvSvc.Files.List();
IList<Google.Apis.Drive.v2.Data.File> fl = lr.Execute().Items;
foreach (Google.Apis.Drive.v2.Data.File file in fl)
{
Console.WriteLine("{0}", file.Title);
}
如上所述,Execute()方法抛出异常......
Google.Apis.Requests.RequestError
Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup. [403]
Errors [
Message[Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup.] Location[ - ] Reason[dailyLimitExceededUnreg] Domain[usageLimits]
]
查看开发者控制台,此配额日志中根本没有使用此API。
所以,我想我的问题非常广泛:我做错了什么? :(
我认为与Google云端硬盘访问相关的问题与缺少结算设置有关。我还不能确定这一点,因为我的公司很难设置这样的东西。如果有人可以为我确认或否认这一点,那就是帮助!
对于目录服务问题,我只是使用Admin SDK来访问用户进行暂停/删除,以及使用Drive备份的服务帐户。我已经将Admin SDK用于此目的,因此在这方面不需要进一步的帮助(尽管对错误的解释很棒,因为它似乎没有在线记录!)