2015-04-24 6 views
8

VerfahrenOrgUnit Nicht Google Directory-API

Ich werde Gefunden mit:

1. Holen Sie sich ein OrgUnit aus dem Google-Verzeichnis API
2. OrgUnit Lesen und die erforderlichen Daten sammeln
3. Versuchen Sie, die OrgUnit, die ich gerade gesammelt habe, zu löschen.

Dies führt irgendwie zu einem Fehler 404 [Not Found]
Bitte beachten Sie, dass die DirectoryService-Klasse, die ich verwende, ordnungsgemäß funktioniert.
I modifiziert, um den Code in diesem Beispiel um es einfach zu lesen, zum Beispiel: Die Ausnahmebehandlung ist nicht usw.

Die API

using Google.Apis.Admin.Directory.directory_v1 

1. eine OrgUnit aus dem Get enthalten Google Verzeichnis API

DirectoryService directoryService = ServiceInitializers.InitializeDirectoryService(); 
OrgUnit oUnit = directoryService.Orgunits.List(Settings.customerId).Execute().OrganizationUnits.FirstOrDefault(); 


2.Read die OrgUnit und sammeln die erforderlichen Daten

string orgUnitPath = oUnit.OrgUnitPath; 


3.Try die OrgUnit löschen Ich sammelte nur

var orgUnitDeleteResult = directoryService.Orgunits.Delete(Settings.customerId, orgUnitPath).Execute(); 


die Ausnahme

GoogleApiException wurde nicht behandelt

Eine nicht behandelte Ausnahme des Typs 'Google.GoogleApiException' aufgetreten in Google.Apis.dll

Zusätzliche Informationen: Google.Apis.Requests.RequestError Org-Einheit nicht gefunden [404]

+1

Sie scheinen FirstOrDefault() zu verwenden, das Ihnen möglicherweise ein leeres Objekt gibt, wenn tatsächlich keine Organisationseinheiten in der Domäne vorhanden sind.Können Sie bestätigen, dass der orgUnitPath ausgefüllt und nicht leer ist? –

+0

In diesem Fall hätte Schritt 2 mir eine NullReferenceException gegeben –

+3

Nicht unbedingt Nick. Vielleicht ist der Wert ** default ** für OrganizationUnits eine Art von Objekt, das eine leere Sammlung enthält. Es darf nicht null sein, es kann nur bedeuten, dass orgUnitPath eine leere Zeichenfolge oder einen Nullwert zurückgibt. Kannst du das bestätigen? Schauen Sie sich die [Beispiele für Enumerable.FirstOrDefault] (https://msdn.microsoft.com/en-us/library/vstudio/bb340482 (v = vs.100) .aspx) für ein leeres Array an. –

Antwort

1

Mein Ruf ist nicht hoch genug, um vor der Veröffentlichung einer Antwort einen Kommentar hinzuzufügen, um eine Klärung zu erhalten, daher muss ich hier einige Annahmen treffen.

Die erste Annahme ist, dass Sie ein Dienstkonto verwenden, um auf die API zuzugreifen.

Die zweite Annahme ist, dass Sie ein Zertifikat von Ihrem Google-Verwaltungskonsole erhalten haben und das alles in Ordnung ist.

Ich hatte ein ähnliches Problem, wenn ich Benutzerkonten über die API aktualisiert habe, und was es für mich behoben hat, war, dass ein Verzeichnisadministratorkonto als Stellvertreter für das Dienstkonto fungiert.

Hier ist der Code, mit dem ich meinen Google Directory Service initialisiere.

private static DirectoryService initializeGoogleDirectoryService() 
{ 
    try 
    { 
     String serviceAccountEmail = "[email protected]"; 

     var certificate = new X509Certificate2(@"your_certificate_name.p12", "your_secret", X509KeyStorageFlags.Exportable); 

     // For the service account to work, a user with admin privs must be assigned as the delegate. 
     ServiceAccountCredential credential = new ServiceAccountCredential(
      new ServiceAccountCredential.Initializer(serviceAccountEmail) 
      { 
       // Change the scope here to the one you need to modify org units. 
       Scopes = new[] { DirectoryService.Scope.AdminDirectoryUser }, 
       User = "[email protected]_google_apps_domain.com" 
      }.FromCertificate(certificate)); 

     // Create the service. 
     var service = new DirectoryService(new BaseClientService.Initializer() 
     { 
      HttpClientInitializer = credential, 
      ApplicationName = "Your_Application_Name" 
     }); 

     return service; 
    } 
    catch (Exception ex) 
    { 
     // Exception handling code below. 
     return null; 
    } 
    finally 
    { 
    } 
}