API рджреНрд╡рд╛рд░реЗ PowerShell рд╡рд░реВрди Google рд╡рд╛рдкрд░рдХрд░реНрддреЗ рддрдпрд╛рд░ рдХрд░рдгреЗ

рд╣рд╛рдп

рд╣рд╛ рд▓реЗрдЦ G Suite рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрдирд╛ рд╣рд╛рддрд╛рд│рдгреНрдпрд╛рд╕рд╛рдареА Google API рд╕рд╣ PowerShell рдкрд░рд╕реНрдкрд░рд╕рдВрд╡рд╛рджрд╛рдЪреНрдпрд╛ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрдЪреЗ рд╡рд░реНрдгрди рдХрд░реЗрд▓.

рдЖрдореНрд╣реА рд╕рдВрдкреВрд░реНрдг рд╕рдВрд╕реНрдереЗрдордзреНрдпреЗ рдЕрдиреЗрдХ рдЕрдВрддрд░реНрдЧрдд рдЖрдгрд┐ рдХреНрд▓рд╛рдЙрдб рд╕реЗрд╡рд╛ рд╡рд╛рдкрд░рддреЛ. рдмрд╣реБрддрд╛рдВрд╢ рднрд╛рдЧрд╛рдВрд╕рд╛рдареА, рддреНрдпрд╛рддреАрд▓ рдЕрдзрд┐рдХреГрддрддрд╛ Google рдХрд┐рдВрд╡рд╛ Active Directory рдХрдбреЗ рдпреЗрддреЗ, рдЬреНрдпрд╛ рджрд░рдореНрдпрд╛рди рдЖрдореНрд╣реА рдкреНрд░рддрд┐рдХреГрддреА рд░рд╛рдЦреВ рд╢рдХрдд рдирд╛рд╣реА; рддреНрдпрд╛рдиреБрд╕рд╛рд░, рдЬреЗрд╡реНрд╣рд╛ рдПрдЦрд╛рджрд╛ рдирд╡реАрди рдХрд░реНрдордЪрд╛рд░реА рдирд┐рдШрддреЛ, рддреЗрд╡реНрд╣рд╛ рддреБрдореНрд╣рд╛рд▓рд╛ рдпрд╛ рджреЛрди рдкреНрд░рдгрд╛рд▓реАрдВрдордзреНрдпреЗ рдЦрд╛рддреЗ рддрдпрд╛рд░/рд╕рдХреНрд╖рдо рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рддреЗ. рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реНрд╡рдпрдВрдЪрд▓рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣реА рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рд╣рд┐рдгреНрдпрд╛рдЪрд╛ рдирд┐рд░реНрдгрдп рдШреЗрддрд▓рд╛ рдЬреА рдорд╛рд╣рд┐рддреА рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рдЖрдгрд┐ рджреЛрдиреНрд╣реА рд╕реЗрд╡рд╛рдВрдирд╛ рдкрд╛рдард╡рддреЗ.

рдЕрдзрд┐рдХреГрддрддрд╛

рдЖрд╡рд╢реНрдпрдХрддрд╛ рд░реЗрдЦрд╛рдЯрддрд╛рдирд╛, рдЖрдореНрд╣реА рдЕрдзрд┐рдХреГрддрддреЗрд╕рд╛рдареА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рдирд╡реА рдкреНрд░рд╢рд╛рд╕рдХ рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪреЗ рдард░рд╡рд┐рд▓реЗ; рд╣реЗ рдЕрдкрдШрд╛рддреА рдХрд┐рдВрд╡рд╛ рд╣реЗрддреБрдкреБрд░рд╕реНрд╕рд░ рдореЛрдареНрдпрд╛ рдкреНрд░рдорд╛рдгрд╛рдд рдмрджрд▓ рдЭрд╛рд▓реНрдпрд╛рд╕ рдХреГрддреАрдВрдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕реБрд▓рдн рдХрд░рддреЗ.

Google API рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдЖрдгрд┐ рдЕрдзрд┐рдХреГрддрддреЗрд╕рд╛рдареА OAuth 2.0 рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╡рд╛рдкрд░рддрд╛рдд. рдкреНрд░рдХрд░рдгреЗ рд╡рд╛рдкрд░рд╛ рдЖрдгрд┐ рдЕрдзрд┐рдХ рддрдкрд╢реАрд▓рд╡рд╛рд░ рд╡рд░реНрдгрди рдпреЗрдереЗ рдЖрдврд│реВ рд╢рдХрддреЗ: Google API рдордзреНрдпреЗ рдкреНрд░рд╡реЗрд╢ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА OAuth 2.0 рд╡рд╛рдкрд░рдгреЗ.

рдореА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╡рдбрд▓реА рдЬреА рдбреЗрд╕реНрдХрдЯреЙрдк рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рдВрдордзреНрдпреЗ рдЕрдзрд┐рдХреГрддрддреЗрд╕рд╛рдареА рд╡рд╛рдкрд░рд▓реА рдЬрд╛рддреЗ. рд╕реЗрд╡рд╛ рдЦрд╛рддреЗ рд╡рд╛рдкрд░рдгреНрдпрд╛рдЪрд╛ рдкрд░реНрдпрд╛рдп рджреЗрдЦреАрд▓ рдЖрд╣реЗ, рдЬреНрдпрд╛рд╕рд╛рдареА рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдХрдбреВрди рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣рд╛рд▓рдЪрд╛рд▓реАрдВрдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╛рд╣реА.

рдЦрд╛рд▓реАрд▓ рдЪрд┐рддреНрд░ Google рдкреГрд╖реНрдард╛рд╡рд░реВрди рдирд┐рд╡рдбрд▓реЗрд▓реНрдпрд╛ рдкрд░рд┐рд╕реНрдерд┐рддреАрдЪреЗ рдпреЛрдЬрдирд╛рдмрджреНрдз рд╡рд░реНрдгрди рдЖрд╣реЗ.

API рджреНрд╡рд╛рд░реЗ PowerShell рд╡рд░реВрди Google рд╡рд╛рдкрд░рдХрд░реНрддреЗ рддрдпрд╛рд░ рдХрд░рдгреЗ

  1. рдкреНрд░рдердо, рдЖрдореНрд╣реА рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рд▓рд╛ GET рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реВрди Google рдЦрд╛рддреЗ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдкреГрд╖реНрдард╛рд╡рд░ рдкрд╛рдард╡рддреЛ:
    • рдЕрд░реНрдЬ рдЖрдпрдбреА
    • рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рд╕ рдЬреНрдпрд╛ рднрд╛рдЧрд╛рдд рдкреНрд░рд╡реЗрд╢ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ
    • рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреВрд░реНрдг рдХреЗрд▓реНрдпрд╛рдирдВрддрд░ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рд▓рд╛ рдЬреНрдпрд╛ рдкрддреНрддреНрдпрд╛рд╡рд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рдИрд▓
    • рдЬреНрдпрд╛ рдкреНрд░рдХрд╛рд░реЗ рдЖрдореНрд╣реА рдЯреЛрдХрди рдЕрдкрдбреЗрдЯ рдХрд░реВ
    • рд╕реБрд░рдХреНрд╖рд╛ рдХреЛрдб
    • рд╕рддреНрдпрд╛рдкрди рдХреЛрдб рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рд╕реНрд╡рд░реВрдк

  2. рдЕрдзрд┐рдХреГрддрддрд╛ рдкреВрд░реНрдг рдЭрд╛рд▓реНрдпрд╛рдирдВрддрд░, рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рд╕ GET рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕рджреНрд╡рд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд▓реЗрд▓реНрдпрд╛ рддреНрд░реБрдЯреА рдХрд┐рдВрд╡рд╛ рдЕрдзрд┐рдХреГрддрддрд╛ рдХреЛрдбрд╕рд╣, рдкрд╣рд┐рд▓реНрдпрд╛ рд╡рд┐рдирдВрддреАрдордзреНрдпреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдкреГрд╖реНрдард╛рд╡рд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рдИрд▓
  3. рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рд╕ (рд╕реНрдХреНрд░рд┐рдкреНрдЯ) рд╣реЗ рдкреЕрд░рд╛рдореАрдЯрд░реНрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдЖрдгрд┐, рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдЭрд╛рд▓реНрдпрд╛рд╕, рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЦрд╛рд▓реАрд▓ рд╡рд┐рдирдВрддреА рдХрд░рд╛
  4. рд╡рд┐рдирдВрддреА рдпреЛрдЧреНрдп рдЕрд╕рд▓реНрдпрд╛рд╕, Google API рдкрд░рдд рдХрд░реЗрд▓:
    • рдкреНрд░рд╡реЗрд╢ рдЯреЛрдХрди рдЬреНрдпрд╛рджреНрд╡рд╛рд░реЗ рдЖрдореНрд╣реА рд╡рд┐рдирдВрддреНрдпрд╛ рдХрд░реВ рд╢рдХрддреЛ
    • рдпрд╛ рдЯреЛрдХрдирдЪреА рд╡реИрдзрддрд╛ рдХрд╛рд▓рд╛рд╡рдзреА
    • рдЕреЕрдХреНрд╕реЗрд╕ рдЯреЛрдХрди рд░рд┐рдлреНрд░реЗрд╢ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЯреЛрдХрди рд░рд┐рдлреНрд░реЗрд╢ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.

рдкреНрд░рдердо рддреБрдореНрд╣рд╛рд▓рд╛ Google API рдХрдиреНрд╕реЛрд▓рд╡рд░ рдЬрд╛рдгреНрдпрд╛рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ: рдХреНрд░реЗрдбреЗрдиреНрд╢рд┐рдпрд▓реНрд╕ - Google API рдХрдиреНрд╕реЛрд▓, рдЗрдЪреНрдЫрд┐рдд рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдирд┐рд╡рдбрд╛ рдЖрдгрд┐ рдХреНрд░реЗрдбреЗрдиреНрд╢рд┐рдпрд▓реНрд╕ рд╡рд┐рднрд╛рдЧрд╛рдд рдХреНрд▓рд╛рдпрдВрдЯ OAuth рдЖрдпрдбреЗрдВрдЯрд┐рдлрд╛рдпрд░ рддрдпрд╛рд░ рдХрд░рд╛. рддреЗрдереЗ (рдХрд┐рдВрд╡рд╛ рдирдВрддрд░, рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдЕрднрд┐рдЬреНрдЮрд╛рдкрдХрд╛рдЪреНрдпрд╛ рдЧреБрдгрдзрд░реНрдорд╛рдВрдордзреНрдпреЗ) рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рдирд╛рд╕ рдЕрдиреБрдорддреА рдЕрд╕рд▓реЗрд▓реЗ рдкрддреНрддреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдЖрдордЪреНрдпрд╛ рдмрд╛рдмрддреАрдд, рдпрд╛ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рдкреЛрд░реНрдЯрд╕рд╣ рдЕрдиреЗрдХ рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рдПрдВрдЯреНрд░реА рдЕрд╕рддреАрд▓ (рдЦрд╛рд▓реА рдкрд╣рд╛).

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрд▓реНрдЧреЛрд░рд┐рджрдо рд╡рд╛рдЪрдгреЗ рдЕрдзрд┐рдХ рд╕реЛрдпреАрд╕реНрдХрд░ рдмрдирд╡рдгреНрдпрд╛рд╕рд╛рдареА, рддреБрдореНрд╣реА рд╡реЗрдЧрд│реНрдпрд╛ рдлрдВрдХреНрд╢рдирдордзреНрдпреЗ рдкреНрд░рдердо рдЪрд░рдг рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реВ рд╢рдХрддрд╛ рдЬреЗ рдНрдкреНрд▓рд┐рдХреЗрд╢рдирд╕рд╛рдареА рдНрдХреНрд╕реЗрд╕ рдЖрдгрд┐ рд░реАрдлреНрд░реЗрд╢ рдЯреЛрдХрди рдкрд░рдд рдХрд░рддреАрд▓:

$client_secret = 'Our Client Secret'
$client_id = 'Our Client ID'
function Get-GoogleAuthToken {
  if (-not [System.Net.HttpListener]::IsSupported) {
    "HttpListener is not supported."
    exit 1
  }
  $codeverifier = -join ((65..90) + (97..122) + (48..57) + 45 + 46 + 95 + 126 |Get-Random -Count 60| % {[char]$_})
  $hasher = new-object System.Security.Cryptography.SHA256Managed
  $hashByteArray = $hasher.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($codeverifier))
  $base64 = ((([System.Convert]::ToBase64String($hashByteArray)).replace('=','')).replace('+','-')).replace('/','_')
  $ports = @(10600,15084,39700,42847,65387,32079)
  $port = $ports[(get-random -Minimum 0 -maximum 5)]
  Write-Host "Start browser..."
  Start-Process "https://accounts.google.com/o/oauth2/v2/auth?code_challenge_method=S256&code_challenge=$base64&access_type=offline&client_id=$client_id&redirect_uri=http://localhost:$port&response_type=code&scope=https://www.googleapis.com/auth/admin.directory.user https://www.googleapis.com/auth/admin.directory.group"
  $listener = New-Object System.Net.HttpListener
  $listener.Prefixes.Add("http://localhost:"+$port+'/')
  try {$listener.Start()} catch {
    "Unable to start listener."
    exit 1
  }
  while (($code -eq $null)) {
    $context = $listener.GetContext()
    Write-Host "Connection accepted" -f 'mag'
    $url = $context.Request.RawUrl
    $code = $url.split('?')[1].split('=')[1].split('&')[0]
    if ($url.split('?')[1].split('=')[0] -eq 'error') {
      Write-Host "Error!"$code -f 'red'
      $buffer = [System.Text.Encoding]::UTF8.GetBytes("Error!"+$code)
      $context.Response.ContentLength64 = $buffer.Length
      $context.Response.OutputStream.Write($buffer, 0, $buffer.Length)
      $context.Response.OutputStream.Close()
      $listener.Stop()
      exit 1
    }
    $buffer = [System.Text.Encoding]::UTF8.GetBytes("Now you can close this browser tab.")
    $context.Response.ContentLength64 = $buffer.Length
    $context.Response.OutputStream.Write($buffer, 0, $buffer.Length)
    $context.Response.OutputStream.Close()
    $listener.Stop()
  }
  Return Invoke-RestMethod -Method Post -Uri "https://www.googleapis.com/oauth2/v4/token" -Body @{
    code = $code
    client_id = $client_id
    client_secret = $client_secret
    redirect_uri = 'http://localhost:'+$port
    grant_type = 'authorization_code'
    code_verifier   = $codeverifier
  }
  $code = $null

рдЖрдореНрд╣реА OAuth рдХреНрд▓рд╛рдпрдВрдЯ рдЖрдпрдбреЗрдВрдЯрд┐рдлрд╛рдпрд░ рдЧреБрдгрдзрд░реНрдорд╛рдВрдордзреНрдпреЗ рдорд┐рд│рд╡рд▓реЗрд▓рд╛ рдХреНрд▓рд╛рдпрдВрдЯ рдЖрдпрдбреА рдЖрдгрд┐ рдХреНрд▓рд╛рдпрдВрдЯ рд╕реАрдХреНрд░реЗрдЯ рд╕реЗрдЯ рдХрд░рддреЛ рдЖрдгрд┐ рдХреЛрдб рд╡реНрд╣реЗрд░рд┐рдлрд╛рдпрд░ рд╣реА 43 рддреЗ 128 рд╡рд░реНрдгрд╛рдВрдЪреА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЖрд╣реЗ рдЬреА рдпрд╛рджреГрдЪреНрдЫрд┐рдХрдкрдгреЗ рдЕрдирд╛рд░рдХреНрд╖рд┐рдд рд╡рд░реНрдгрд╛рдВрдордзреВрди рддрдпрд╛рд░ рдХреЗрд▓реА рдЬрд╛рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ: [AZ] / [az] / [0-9 ] / "-" / "." / "_" / "~".

рд╣рд╛ рдХреЛрдб рдирдВрддрд░ рдкреБрдиреНрд╣рд╛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХреЗрд▓рд╛ рдЬрд╛рдИрд▓. рд╣реЗ рдЕрд╕реБрд░рдХреНрд╖рд╛ рдХрд╛рдвреВрди рдЯрд╛рдХрддреЗ рдЬреНрдпрд╛рдордзреНрдпреЗ рдЖрдХреНрд░рдордгрдХрд░реНрддрд╛ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдЪреНрдпрд╛ рдЕрдзрд┐рдХреГрддрддреЗрдирдВрддрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдореНрд╣рдгреВрди рдкрд░рдд рдЖрд▓реЗрд▓реНрдпрд╛ рдкреНрд░рддрд┐рд╕рд╛рджрд╛рдд рдЕрдбрдерд│рд╛ рдЖрдгреВ рд╢рдХрддреЛ.
рддреБрдореНрд╣реА рд╕рдзреНрдпрд╛рдЪреНрдпрд╛ рд╡рд┐рдирдВрддреАрдордзреНрдпреЗ рд╕реНрдкрд╖реНрдЯ рдордЬрдХреВрд░рд╛рдд рдХреЛрдб рдкрдбрддрд╛рд│рдгреАрдХрд░реНрддрд╛ рдкрд╛рдард╡реВ рд╢рдХрддрд╛ (рдЬреЗ рддреЗ рдирд┐рд░рд░реНрдердХ рдмрдирд╡рддреЗ - рд╣реЗ рдХреЗрд╡рд│ SHA256 рд▓рд╛ рд╕рдкреЛрд░реНрдЯ рди рдХрд░рдгрд╛рд▒реНрдпрд╛ рд╕рд┐рд╕реНрдЯрдорд╕рд╛рдареАрдЪ рдпреЛрдЧреНрдп рдЖрд╣реЗ), рдХрд┐рдВрд╡рд╛ SHA256 рдЕрд▓реНрдЧреЛрд░рд┐рджрдо рд╡рд╛рдкрд░реВрди рд╣реЕрд╢ рддрдпрд╛рд░ рдХрд░реВрди, рдЬреЗ BASE64Url рдордзреНрдпреЗ рдПрдиреНрдХреЛрдб рдХреЗрд▓реЗрд▓реЗ рдЕрд╕рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ (рднрд┐рдиреНрди Base64 рд╡рд░реВрди рджреЛрди рд╕рд╛рд░рдгреА рд╡рд░реНрдгрд╛рдВрджреНрд╡рд╛рд░реЗ) рдЖрдгрд┐ рд╡рд░реНрдг рд░реЗрдЦрд╛ рд╕рдорд╛рдкреНрддреА рдХрд╛рдвреВрди рдЯрд╛рдХрдгреЗ: =.

рдкреБрдвреЗ, рдЕрдзрд┐рдХреГрддрддреЗрдирдВрддрд░ рдкреНрд░рддрд┐рд╕рд╛рдж рдкреНрд░рд╛рдкреНрдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣рд╛рд▓рд╛ рд╕реНрдерд╛рдирд┐рдХ рдорд╢реАрдирд╡рд░ HTTP рдРрдХрдгреЗ рд╕реБрд░реВ рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧреЗрд▓, рдЬреЗ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди рдореНрд╣рдгреВрди рдкрд░рдд рдХреЗрд▓реЗ рдЬрд╛рдИрд▓.

рдкреНрд░рд╢рд╛рд╕рдХреАрдп рдХрд╛рд░реНрдпреЗ рдПрдХрд╛ рд╡рд┐рд╢реЗрд╖ рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рдХреЗрд▓реА рдЬрд╛рддрд╛рдд, рдЖрдореНрд╣реА рдПрдХрд╛рдЪ рд╡реЗрд│реА рдЕрдиреЗрдХ рдкреНрд░рд╢рд╛рд╕рдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд╛рд▓рд╡рдгреНрдпрд╛рдЪреА рд╢рдХреНрдпрддрд╛ рдирд╛рдХрд╛рд░реВ рд╢рдХрдд рдирд╛рд╣реА, рдореНрд╣рдгреВрди рддреЗ рд╡рд░реНрддрдорд╛рди рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рд╕рд╛рдареА рдпрд╛рджреГрдЪреНрдЫрд┐рдХрдкрдгреЗ рдПрдХ рдкреЛрд░реНрдЯ рдирд┐рд╡рдбреЗрд▓, рдкрд░рдВрддреБ рдореА рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдкреЛрд░реНрдЯ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЗрд▓реЗ рдХрд╛рд░рдг рддреЗ API рдХрдиреНрд╕реЛрд▓рдордзреНрдпреЗ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдореНрд╣рдгреВрди рджреЗрдЦреАрд▓ рдЬреЛрдбрд▓реЗ рдЬрд╛рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.

access_type=рдСрдлрд▓рд╛рдЗрди рдпрд╛рдЪрд╛ рдЕрд░реНрде рдЕрд╕рд╛ рдЖрд╣реЗ рдХреА рдмреНрд░рд╛рдЙрдЭрд░рд╕рд╣ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдЪреНрдпрд╛ рдкрд░рд╕реНрдкрд░рд╕рдВрд╡рд╛рджрд╛рд╢рд┐рд╡рд╛рдп рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╛рд▓рдмрд╛рд╣реНрдп рдЯреЛрдХрди рд╕реНрд╡рддрдГрдЪ рдЕрдкрдбреЗрдЯ рдХрд░реВ рд╢рдХрддреЛ,
рдкреНрд░рддрд┐рд╕рд╛рдж_рдкреНрд░рдХрд╛рд░=рдХреЛрдб рдХреЛрдб рдХрд╕рд╛ рдкрд░рдд рдХреЗрд▓рд╛ рдЬрд╛рдИрд▓ рдпрд╛рдЪреЗ рд╕реНрд╡рд░реВрдк рд╕реЗрдЯ рдХрд░рддреЗ (рдЬреБрдиреНрдпрд╛ рдЕрдзрд┐рдХреГрддрддрд╛ рдкрджреНрдзрддреАрдЪрд╛ рд╕рдВрджрд░реНрдн, рдЬреЗрд╡реНрд╣рд╛ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдиреЗ рдмреНрд░рд╛рдЙрдЭрд░рдордзреВрди рдХреЛрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯрдордзреНрдпреЗ рдХреЙрдкреА рдХреЗрд▓рд╛),
рд╡реНрдпрд╛рдкреНрддреА рдкреНрд░рд╡реЗрд╢рд╛рдЪреА рд╡реНрдпрд╛рдкреНрддреА рдЖрдгрд┐ рдкреНрд░рдХрд╛рд░ рд╕реВрдЪрд┐рдд рдХрд░рддреЗ. рддреЗ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдХрд┐рдВрд╡рд╛ %20 (URL рдПрдиреНрдХреЛрдбрд┐рдВрдЧрдиреБрд╕рд╛рд░) рд╡рд┐рднрдХреНрдд рдХреЗрд▓реЗ рдкрд╛рд╣рд┐рдЬреЗрдд. рдкреНрд░рдХрд╛рд░рд╛рдВрд╕рд╣ рдкреНрд░рд╡реЗрд╢ рдХреНрд╖реЗрддреНрд░рд╛рдВрдЪреА рд╕реВрдЪреА рдпреЗрдереЗ рдкрд╛рд╣рд┐рд▓реА рдЬрд╛рдК рд╢рдХрддреЗ: Google API рд╕рд╛рдареА OAuth 2.0 рд╕реНрдХреЛрдк.

рдЕрдзрд┐рдХреГрддрддрд╛ рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХреЗрд▓реНрдпрд╛рдирдВрддрд░, рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдмреНрд░рд╛рдЙрдЭрд░рд▓рд╛ рдПрдХ рдЬрд╡рд│рдЪрд╛ рд╕рдВрджреЗрд╢ рджреЗрдИрд▓, рдкреЛрд░реНрдЯрд╡рд░ рдРрдХрдгреЗ рдерд╛рдВрдмрд╡реЗрд▓ рдЖрдгрд┐ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА POST рд╡рд┐рдирдВрддреА рдкрд╛рдард╡реЗрд▓. рдЖрдореНрд╣реА рддреНрдпрд╛рдд рдкреВрд░реНрд╡реА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЗрд▓реЗрд▓рд╛ рдЖрдпрдбреА рдЖрдгрд┐ рдХрдиреНрд╕реЛрд▓ API рдордзреАрд▓ рдЧреБрдкреНрдд, рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рд▓рд╛ рдЬреНрдпрд╛ рдкрддреНрддреНрдпрд╛рд╡рд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХреЗрд▓реЗ рдЬрд╛рдИрд▓ рдЖрдгрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рддрдкрд╢реАрд▓рд╛рдиреБрд╕рд╛рд░ grant_type рд╕реВрдЪрд┐рдд рдХрд░рддреЛ.

рдкреНрд░рддрд┐рд╕рд╛рджрд╛рдд, рдЖрдореНрд╣рд╛рд▓рд╛ рдПрдХ рдНрдХреНрд╕реЗрд╕ рдЯреЛрдХрди, рддреНрдпрд╛рдЪреА рд╡реИрдзрддрд╛ рдХрд╛рд╣реА рд╕реЗрдХрдВрджрд╛рдд рдЖрдгрд┐ рд░рд┐рдлреНрд░реЗрд╢ рдЯреЛрдХрди рдорд┐рд│реЗрд▓, рдЬреНрдпрд╛рджреНрд╡рд╛рд░реЗ рдЖрдореНрд╣реА рдНрдХреНрд╕реЗрд╕ рдЯреЛрдХрди рдЕрдкрдбреЗрдЯ рдХрд░реВ рд╢рдХрддреЛ.

рдЕреЕрдкреНрд▓рд┐рдХреЗрд╢рдирдиреЗ рдЯреЛрдХрдиреНрд╕ рдПрдХрд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рдард┐рдХрд╛рдгреА рджреАрд░реНрдШ рд╢реЗрд▓реНрдл рд▓рд╛рдЗрдлрд╕рд╣ рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ, рдореНрд╣рдгреВрди рдЬреЛрдкрд░реНрдпрдВрдд рдЖрдореНрд╣реА рдкреНрд░рд╛рдкреНрдд рдХреЗрд▓реЗрд▓рд╛ рдкреНрд░рд╡реЗрд╢ рд░рджреНрдж рдХрд░рдд рдирд╛рд╣реА рддреЛрдкрд░реНрдпрдВрдд, рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд░рд┐рдлреНрд░реЗрд╢ рдЯреЛрдХрди рдкрд░рдд рдХрд░рдгрд╛рд░ рдирд╛рд╣реА. рд╢реЗрд╡рдЯреА, рдореА рдЯреЛрдХрди рдорд╛рдЧреЗ рдШреЗрдгреНрдпрд╛рдЪреА рд╡рд┐рдирдВрддреА рдЬреЛрдбрд▓реА; рдЬрд░ рдЕрд░реНрдЬ рдпрд╢рд╕реНрд╡реАрд░рд┐рддреНрдпрд╛ рдкреВрд░реНрдг рдЭрд╛рд▓рд╛ рдирд╛рд╣реА рдЖрдгрд┐ рд░реАрдлреНрд░реЗрд╢ рдЯреЛрдХрди рдкрд░рдд рдХреЗрд▓реЗ рдЧреЗрд▓реЗ рдирд╛рд╣реА, рддрд░ рддреЗ рдкреБрдиреНрд╣рд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реБрд░реВ рдХрд░реЗрд▓ (рдЖрдореНрд╣реА рдЯрд░реНрдорд┐рдирд▓рд╡рд░ рд╕реНрдерд╛рдирд┐рдХ рдкрд╛рддрд│реАрд╡рд░ рдЯреЛрдХрди рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рдгреЗ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдорд╛рдирд▓реЗ рдЖрдгрд┐ рдЖрдореНрд╣реА рд╣реЗ рдХрд░реВ рд╢рдХрдд рдирд╛рд╣реА. рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреАрдиреЗ рдЧреЛрд╖реНрдЯреА рдХреНрд▓рд┐рд╖реНрдЯ рдХрд░реВ рдЗрдЪреНрдЫрд┐рдд рдирд╛рд╣реА рдХрд┐рдВрд╡рд╛ рдмреНрд░рд╛рдЙрдЭрд░ рд╡рд╛рд░рдВрд╡рд╛рд░ рдЙрдШрдбреВ рдЗрдЪреНрдЫрд┐рдд рдирд╛рд╣реА).

do {
  $token_result = Get-GoogleAuthToken
  $token = $token_result.access_token
  if ($token_result.refresh_token -eq $null) {
    Write-Host ("Session is not destroyed. Revoking token...")
    Invoke-WebRequest -Uri ("https://accounts.google.com/o/oauth2/revoke?token="+$token)
  }
} while ($token_result.refresh_token -eq $null)
$refresh_token = $token_result.refresh_token
$minute = ([int]("{0:mm}" -f ([timespan]::fromseconds($token_result.expires_in))))+((Get-date).Minute)-2
if ($minute -lt 0) {$minute += 60}
elseif ($minute -gt 59) {$minute -=60}
$token_expire = @{
  hour = ([int]("{0:hh}" -f ([timespan]::fromseconds($token_result.expires_in))))+((Get-date).Hour)
  minute = $minute
}

рддреБрдореНрд╣реА рдЖрдзреАрдЪ рд▓рдХреНрд╖рд╛рдд рдШреЗрддрд▓реНрдпрд╛рдкреНрд░рдорд╛рдгреЗ, рдЯреЛрдХрди рд░рджреНрдж рдХрд░рддрд╛рдирд╛, Invoke-WebRequest рд╡рд╛рдкрд░рд▓рд╛ рдЬрд╛рддреЛ. Invoke-RestMethod рдЪреНрдпрд╛ рд╡рд┐рдкрд░реАрдд, рддреЗ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рд╡рд╛рдкрд░рдгреНрдпрд╛рдпреЛрдЧреНрдп рд╕реНрд╡рд░реВрдкрд╛рдд рдкрд░рдд рдХрд░рдд рдирд╛рд╣реА рдЖрдгрд┐ рд╡рд┐рдирдВрддреАрдЪреА рд╕реНрдерд┐рддреА рджрд░реНрд╢рд╡рддреЗ.

рдкреБрдвреЗ, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рддреБрдореНрд╣рд╛рд▓рд╛ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдЪреЗ рдирд╛рд╡ рдЖрдгрд┐ рдЖрдбрдирд╛рд╡ рдкреНрд░рд╡рд┐рд╖реНрдЯ рдХрд░рдгреНрдпрд╛рд╕ рд╕рд╛рдВрдЧрддреЗ, рд▓реЙрдЧрд┐рди + рдИрдореЗрд▓ рддрдпрд╛рд░ рдХрд░рддреЗ.

рдЪреМрдХрд╢реНрдпрд╛

рдкреБрдвреАрд▓ рд╡рд┐рдирдВрддреНрдпрд╛ рдЕрд╕рддреАрд▓ - рд╕рд░реНрд╡ рдкреНрд░рдердо, рдирд╡реАрди рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдХрд┐рдВрд╡рд╛ рд╡рд░реНрддрдорд╛рди рд╕рдХреНрд╖рдо рдХрд░рдгреНрдпрд╛рдЪрд╛ рдирд┐рд░реНрдгрдп рдШреЗрдгреНрдпрд╛рд╕рд╛рдареА рд╕рдорд╛рди рд▓реЙрдЧрд┐рди рдЕрд╕рд▓реЗрд▓рд╛ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рдЖрдзреАрдкрд╛рд╕реВрдирдЪ рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдЖрд╣реЗ рдХреА рдирд╛рд╣реА рд╣реЗ рддрдкрд╛рд╕рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.

рдореА рд╕реНрд╡рд┐рдЪ рд╡рд╛рдкрд░реВрди рдирд┐рд╡рдбреАрд╕рд╣ рд╕рд░реНрд╡ рд╡рд┐рдирдВрддреНрдпрд╛ рдПрдХрд╛ рдлрдВрдХреНрд╢рдирдЪреНрдпрд╛ рд╕реНрд╡рд░реВрдкрд╛рдд рд▓рд╛рдЧреВ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдирд┐рд░реНрдгрдп рдШреЗрддрд▓рд╛:

function GoogleQuery {
  param (
    $type,
    $query
  )
  switch ($type) {
    "SearchAccount" {
      Return Invoke-RestMethod -Method Get -Uri "https://www.googleapis.com/admin/directory/v1/users" -Headers @{Authorization = "Bearer "+(Get-GoogleToken)} -Body @{
        domain = 'rocketguys.com'
        query  = "email:$query"
      }
    }
    "UpdateAccount" {
      $body = @{
        name  = @{
          givenName = $query['givenName']
          familyName = $query['familyName']
        }
        suspended = 'false'
        password = $query['password']
        changePasswordAtNextLogin = 'true'
        phones = @(@{
          primary = 'true'
          value = $query['phone']
          type = "mobile"
        })
        orgUnitPath = $query['orgunit']
      }
      Return Invoke-RestMethod -Method Put -Uri ("https://www.googleapis.com/admin/directory/v1/users/"+$query['email']) -Headers @{Authorization = "Bearer "+(Get-GoogleToken)} -Body (ConvertTo-Json $body) -ContentType 'application/json; charset=utf-8'
    }
    
    "CreateAccount" {
      $body = @{
        primaryEmail = $query['email']
        name  = @{
          givenName = $query['givenName']
          familyName = $query['familyName']
        }
        suspended = 'false'
        password = $query['password']
        changePasswordAtNextLogin = 'true'
        phones = @(@{
          primary = 'true'
          value = $query['phone']
          type = "mobile"
        })
        orgUnitPath = $query['orgunit']
      }
      Return Invoke-RestMethod -Method Post -Uri "https://www.googleapis.com/admin/directory/v1/users" -Headers @{Authorization = "Bearer "+(Get-GoogleToken)} -Body (ConvertTo-Json $body) -ContentType 'application/json; charset=utf-8'
    }
    "AddMember" {
      $body = @{
        userKey = $query['email']
      }
      $ifrequest = Invoke-RestMethod -Method Get -Uri "https://www.googleapis.com/admin/directory/v1/groups" -Headers @{Authorization = "Bearer "+(Get-GoogleToken)} -Body $body
      $array = @()
      foreach ($group in $ifrequest.groups) {$array += $group.email}
      if ($array -notcontains $query['groupkey']) {
        $body = @{
          email = $query['email']
          role = "MEMBER"
        }
        Return Invoke-RestMethod -Method Post -Uri ("https://www.googleapis.com/admin/directory/v1/groups/"+$query['groupkey']+"/members") -Headers @{Authorization = "Bearer "+(Get-GoogleToken)} -Body (ConvertTo-Json $body) -ContentType 'application/json; charset=utf-8'
      } else {
        Return ($query['email']+" now is a member of "+$query['groupkey'])
      }
    }
  }
}

рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдирдВрддреАрдордзреНрдпреЗ, рддреБрдореНрд╣рд╛рд▓рд╛ рдЯреЛрдХрди рдкреНрд░рдХрд╛рд░ рдЖрдгрд┐ рд╕реНрд╡рддрдГ рдкреНрд░рд╡реЗрд╢ рдЯреЛрдХрди рдЕрд╕рд▓реЗрд▓реЗ рдЕрдзрд┐рдХреГрддрддрд╛ рд╢реАрд░реНрд╖рд▓реЗрдЦ рдкрд╛рдард╡рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рд╕рдзреНрдпрд╛, рдЯреЛрдХрди рдкреНрд░рдХрд╛рд░ рдиреЗрд╣рдореАрдЪ рд╡рд╛рд╣рдХ рдЕрд╕рддреЛ. рдХрд╛рд░рдг рдЯреЛрдХрди рдХрд╛рд▓рдмрд╛рд╣реНрдп рдЭрд╛рд▓реЗ рдирд╕рд▓реНрдпрд╛рдЪреЗ рддрдкрд╛рд╕рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдЖрдгрд┐ рддреЗ рдЬрд╛рд░реА рдХреЗрд▓реНрдпрд╛рдкрд╛рд╕реВрди рдПрдХ рддрд╛рд╕рд╛рдирдВрддрд░ рддреЗ рдЕрджреНрдпрддрдирд┐рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ, рдореА рджреБрд╕рд░реНтАНрдпрд╛ рдлрдВрдХреНрд╢рдирд╕рд╛рдареА рд╡рд┐рдирдВрддреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЗрд▓реА рдЖрд╣реЗ рдЬреА рдкреНрд░рд╡реЗрд╢ рдЯреЛрдХрди рдкрд░рдд рдХрд░рддреЗ. рдкреНрд░рдердо рдкреНрд░рд╡реЗрд╢ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛рдирд╛ рдХреЛрдбрдЪрд╛ рд╕рдорд╛рди рднрд╛рдЧ рд╕реНрдХреНрд░рд┐рдкреНрдЯрдЪреНрдпрд╛ рд╕реБрд░реБрд╡рд╛рддреАрд▓рд╛ рдЕрд╕рддреЛ:

function Get-GoogleToken {
  if (((Get-date).Hour -gt $token_expire.hour) -or (((Get-date).Hour -ge $token_expire.hour) -and ((Get-date).Minute -gt $token_expire.minute))) {
  Write-Host "Token Expired. Refreshing..."
    $request = (Invoke-RestMethod -Method Post -Uri "https://www.googleapis.com/oauth2/v4/token" -ContentType 'application/x-www-form-urlencoded' -Body @{
      client_id = $client_id
      client_secret = $client_secret
      refresh_token = $refresh_token
      grant_type = 'refresh_token'
    })
    $token = $request.access_token
    $minute = ([int]("{0:mm}" -f ([timespan]::fromseconds($request.expires_in))))+((Get-date).Minute)-2
    if ($minute -lt 0) {$minute += 60}
    elseif ($minute -gt 59) {$minute -=60}
    $script:token_expire = @{
      hour = ([int]("{0:hh}" -f ([timespan]::fromseconds($request.expires_in))))+((Get-date).Hour)
      minute = $minute
    }
  }
  return $token
}

рдЕрд╕реНрддрд┐рддреНрд╡рд╛рд╕рд╛рдареА рд▓реЙрдЧрд┐рди рддрдкрд╛рд╕рдд рдЖрд╣реЗ:

function Check_Google {
  $query = (GoogleQuery 'SearchAccount' $username)
  if ($query.users -ne $null) {
    $user = $query.users[0]
    Write-Host $user.name.fullName' - '$user.PrimaryEmail' - suspended: '$user.Suspended
    $GAresult = $user
  }
  if ($GAresult) {
      $return = $GAresult
  } else {$return = 'gg'}
  return $return
}

рдИрдореЗрд▓:$query рд╡рд┐рдирдВрддреА рдПрдкреАрдЖрдпрд▓рд╛ рдЙрдкрдирд╛рдорд╛рдВрд╕рд╣ рдиреЗрдордХрд╛ рддреЛ рдИрдореЗрд▓ рдЕрд╕рд▓реЗрд▓рд╛ рд╡рд╛рдкрд░рдХрд░реНрддрд╛ рд╢реЛрдзрдгреНрдпрд╛рд╕ рд╕рд╛рдВрдЧреЗрд▓. рддреБрдореНрд╣реА рд╡рд╛рдЗрд▓реНрдбрдХрд╛рд░реНрдб рджреЗрдЦреАрд▓ рд╡рд╛рдкрд░реВ рд╢рдХрддрд╛: =, :, :{PREFIX}*.

рдбреЗрдЯрд╛ рдорд┐рд│рд╡рдгреНрдпрд╛рд╕рд╛рдареА, GET рд╡рд┐рдирдВрддреА рдкрджреНрдзрдд рд╡рд╛рдкрд░рд╛, рдбреЗрдЯрд╛ рдШрд╛рд▓рдгреНрдпрд╛рд╕рд╛рдареА (рдЦрд╛рддреЗ рддрдпрд╛рд░ рдХрд░рдгреЗ рдХрд┐рдВрд╡рд╛ рдЧрдЯрд╛рдордзреНрдпреЗ рд╕рджрд╕реНрдп рдЬреЛрдбрдгреЗ) - POST, рд╡рд┐рджреНрдпрдорд╛рди рдбреЗрдЯрд╛ рдЕрджреНрдпрддрдирд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА - PUT, рд░реЗрдХреЙрд░реНрдб рд╣рдЯрд╡рд┐рдгреНрдпрд╛рд╕рд╛рдареА (рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рд╕рдореВрд╣рд╛рддреАрд▓ рд╕рджрд╕реНрдп) - рд╣рдЯрд╡рд╛.

рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлреЛрди рдирдВрдмрд░ (рдЕрдкреНрд░рдорд╛рдгрд┐рдд рд╕реНрдЯреНрд░рд┐рдВрдЧ) рдЖрдгрд┐ рдкреНрд░рд╛рджреЗрд╢рд┐рдХ рд╡рд┐рддрд░рдг рдЧрдЯрд╛рдордзреНрдпреЗ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рджреЗрдЦреАрд▓ рд╡рд┐рдЪрд╛рд░реЗрд▓. рдирд┐рд╡рдбрд▓реЗрд▓реНрдпрд╛ Active Directory OU рдЪреНрдпрд╛ рдЖрдзрд╛рд░реЗ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдиреЗ рдХреЛрдгрддреЗ рд╕рдВрд╕реНрдерд╛рддреНрдордХ рдпреБрдирд┐рдЯ рдЕрд╕рд╛рд╡реЗ рд╣реЗ рддреЗ рдард░рд╡рддреЗ рдЖрдгрд┐ рдкрд╛рд╕рд╡рд░реНрдбрд╕рд╣ рдпреЗрддреЛ:

do {
  $phone = Read-Host "╨в╨╡╨╗╨╡╤Д╨╛╨╜ ╨▓ ╤Д╨╛╤А╨╝╨░╤В╨╡ +7╤Е╤Е╤Е╤Е╤Е╤Е╤Е╤Е"
} while (-not $phone)
do {
    $moscow = Read-Host "╨Т ╨Ь╨╛╤Б╨║╨╛╨▓╤Б╨║╨╕╨╣ ╨╛╤Д╨╕╤Б? (y/n) "
} while (-not (($moscow -eq 'y') -or ($moscow -eq 'n')))
$orgunit = '/'
if ($OU -like "*OU=Delivery,OU=Users,OU=ROOT,DC=rocket,DC=local") {
    Write-host "╨С╤Г╨┤╨╡╤В ╤Б╨╛╨╖╨┤╨░╨╜╨░ ╨▓ /Team delivery"
    $orgunit = "/Team delivery"
}
$Password =  -join ( 48..57 + 65..90 + 97..122 | Get-Random -Count 12 | % {[char]$_})+"*Ba"

рдЖрдгрд┐ рдордЧ рддреЛ рдЦрд╛рддреНрдпрд╛рдд рдлреЗрд░рдлрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕ рд╕реБрд░рд╡рд╛рдд рдХрд░рддреЛ:

$query = @{
  email = $email
  givenName = $firstname
  familyName = $lastname
  password = $password
  phone = $phone
  orgunit = $orgunit
}
if ($GMailExist) {
  Write-Host "╨Ч╨░╨┐╤Г╤Б╨║╨░╨╡╨╝ ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╨╡ ╨░╨║╨║╨░╤Г╨╜╤В╨░" -f mag
  (GoogleQuery 'UpdateAccount' $query) | fl
  write-host "╨Э╨╡ ╨╖╨░╨▒╤Г╨┤╤М ╨┐╤А╨╛╨▓╨╡╤А╨╕╤В╤М ╨│╤А╤Г╨┐╨┐╤Л ╤Г ╨▓╨║╨╗╤О╤З╨╡╨╜╨╜╨╛╨│╨╛ $Username ╨▓ Google."
} else {
  Write-Host "╨Ч╨░╨┐╤Г╤Б╨║╨░╨╡╨╝ ╤Б╨╛╨╖╨┤╨░╨╜╨╕╨╡ ╨░╨║╨║╨░╤Г╨╜╤В╨░" -f mag
  (GoogleQuery 'CreateAccount' $query) | fl
}
if ($moscow -eq "y"){
  write-host "╨Ф╨╛╨▒╨░╨▓╨╗╤П╨╡╨╝ ╨▓ ╨│╤А╤Г╨┐╨┐╤Г moscowoffice"
  $query = @{
    groupkey = '[email protected]'
    email = $email
  }
  (GoogleQuery 'AddMember' $query) | fl
}

рдЦрд╛рддреЗ рдЕрджреНрдпрдпрд╛рд╡рдд рдХрд░рдгреЗ рдЖрдгрд┐ рддрдпрд╛рд░ рдХрд░рдгреЗ рдпрд╛ рдлрдВрдХреНрд╢рдиреНрд╕рдордзреНрдпреЗ рд╕рдорд╛рди рд╡рд╛рдХреНрдпрд░рдЪрдирд╛ рдЕрд╕рддреЗ; рд╕рд░реНрд╡ рдЕрддрд┐рд░рд┐рдХреНрдд рдлреАрд▓реНрдб рдЖрд╡рд╢реНрдпрдХ рдирд╛рд╣реАрдд; рдлреЛрди рдирдВрдмрд░рд╕рд╣ рд╡рд┐рднрд╛рдЧрд╛рдд, рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдПрдХ рдЕреЕрд░реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдЬреНрдпрд╛рдордзреНрдпреЗ рдирдВрдмрд░ рдЖрдгрд┐ рддреНрдпрд╛рдЪреНрдпрд╛ рдкреНрд░рдХрд╛рд░рд╛рд╕рд╣ рдПрдХ рд░реЗрдХреЙрд░реНрдб рдЕрд╕реВ рд╢рдХрддреЛ.

рдЧрдЯрд╛рдордзреНрдпреЗ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рд▓рд╛ рдЬреЛрдбрддрд╛рдирд╛ рддреНрд░реБрдЯреА рдпреЗрдК рдирдпреЗ рдореНрд╣рдгреВрди, рдЖрдореНрд╣реА рдкреНрд░рдердо рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдХрдбреВрди рдЧрдЯ рд╕рджрд╕реНрдпрд╛рдВрдЪреА рдпрд╛рджреА рдХрд┐рдВрд╡рд╛ рд░рдЪрдирд╛ рдорд┐рд│рд╡реВрди рддреЛ рдЖрдзреАрдЪ рдпрд╛ рдЧрдЯрд╛рдЪрд╛ рд╕рджрд╕реНрдп рдЖрд╣реЗ рдХреА рдирд╛рд╣реА рд╣реЗ рддрдкрд╛рд╕реВ рд╢рдХрддреЛ.

рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдЪреНрдпрд╛ рдЧрдЯ рд╕рджрд╕реНрдпрддреНрд╡рд╛рдЪреА рдЪреМрдХрд╢реА рдХрд░рдгреЗ рдкреБрдирд░рд╛рд╡реГрддреНрддреА рд╣реЛрдгрд╛рд░ рдирд╛рд╣реА рдЖрдгрд┐ рдХреЗрд╡рд│ рдереЗрдЯ рд╕рджрд╕реНрдпрддреНрд╡ рджрд░реНрд╢рд╡реЗрд▓. рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдЪрд╛ рд╕рджрд╕реНрдп рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдкрд╛рд▓рдХ рдЧрдЯрд╛рддреАрд▓ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдЪрд╛ рд╕рдорд╛рд╡реЗрд╢ рдХрд░рдгреЗ рдпрд╢рд╕реНрд╡реА рд╣реЛрдИрд▓.

рдирд┐рд╖реНрдХрд░реНрд╖

рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рд▓рд╛ рдирд╡реАрди рдЦрд╛рддреНрдпрд╛рд╕рд╛рдареА рдкрд╛рд╕рд╡рд░реНрдб рдкрд╛рдард╡рдгреЗ рдмрд╛рдХреА рдЖрд╣реЗ. рдЖрдореНрд╣реА рд╣реЗ рдПрд╕рдПрдордПрд╕рджреНрд╡рд╛рд░реЗ рдХрд░рддреЛ, рдЖрдгрд┐ рд╕реВрдЪрдирд╛рдВрд╕рд╣ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рд╣рд┐рддреА рдкрд╛рдард╡рддреЛ рдЖрдгрд┐ рд╡реИрдпрдХреНрддрд┐рдХ рдИрдореЗрд▓рд╡рд░ рд▓реЙрдЧ рдЗрди рдХрд░рддреЛ, рдЬреЛ рдлреЛрди рдирдВрдмрд░рд╕рд╣, рднрд░реНрддреА рд╡рд┐рднрд╛рдЧрд╛рдиреЗ рдкреНрд░рджрд╛рди рдХреЗрд▓рд╛ рд╣реЛрддрд╛. рдПрдХ рдкрд░реНрдпрд╛рдп рдореНрд╣рдгреВрди, рддреБрдореНрд╣реА рдкреИрд╕реЗ рд╡рд╛рдЪрд╡реВ рд╢рдХрддрд╛ рдЖрдгрд┐ рдЧреБрдкреНрдд рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдЪреЕрдЯрд╡рд░ рддреБрдордЪрд╛ рдкрд╛рд╕рд╡рд░реНрдб рдкрд╛рдард╡реВ рд╢рдХрддрд╛, рдЬреЛ рджреБрд╕рд░рд╛ рдШрдЯрдХ рджреЗрдЦреАрд▓ рдорд╛рдирд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ (рдореЕрдХрдмреБрдХ рдЕрдкрд╡рд╛рдж рдЕрд╕реЗрд▓).

рд╢реЗрд╡рдЯрдкрд░реНрдпрдВрдд рд╡рд╛рдЪрд▓реНрдпрд╛рдмрджреНрджрд▓ рдзрдиреНрдпрд╡рд╛рдж. рд▓реЗрдЦ рд▓рд┐рд╣рд┐рдгреНрдпрд╛рдЪреА рд╢реИрд▓реА рд╕реБрдзрд╛рд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕реВрдЪрдирд╛ рдкрд╛рд╣реВрди рдорд▓рд╛ рдЖрдирдВрдж рд╣реЛрдИрд▓ рдЖрдгрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рд▓рд┐рд╣рд┐рддрд╛рдирд╛ рддреБрдореНрд╣реА рдХрдореА рдЪреБрдХрд╛ рд▓рдХреНрд╖рд╛рдд рдШреНрдпрд╛рд╡реНрдпрд╛рдд рдЕрд╢реА рдЗрдЪреНрдЫрд╛ рдЖрд╣реЗ =)

рдереАрдореЕрдЯрд┐рдХрджреГрд╖реНрдЯреНрдпрд╛ рдЙрдкрдпреБрдХреНрдд рдХрд┐рдВрд╡рд╛ рдлрдХреНрдд рдкреНрд░рд╢реНрдирд╛рдВрдЪреА рдЙрддреНрддрд░реЗ рджреЗрдгрд╛рд▒реНрдпрд╛ рд▓рд┐рдВрдХреНрд╕рдЪреА рдпрд╛рджреА:

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛