API рдорд╛рд░реНрдлрдд PowerShell рдмрд╛рдЯ Google рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджреИ

рдирдорд╕реНрддреЗ!

рдпрд╕ рд▓реЗрдЦрд▓реЗ G Suite рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрд▓рд╛рдИ рд╣реЗрд░рдлреЗрд░ рдЧрд░реНрди Google API рд╕рдБрдЧ PowerShell рдЕрдиреНрддрд░рдХреНрд░рд┐рдпрд╛рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХреЛ рд╡рд░реНрдгрди рдЧрд░реНрдиреЗрдЫред

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

рдкреНрд░рд╛рдзрд┐рдХрд░рдг

рдЖрд╡рд╢реНрдпрдХрддрд╛рд╣рд░реВ рдХреЛрд░реНрджрд╛, рд╣рд╛рдореАрд▓реЗ рдкреНрд░рд╛рдзрд┐рдХрд░рдгрдХреЛ рд▓рд╛рдЧрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдорд╛рдирд╡ рдкреНрд░рд╢рд╛рд╕рдХрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реНрдпреМрдВ; рдпрд╕рд▓реЗ рдЖрдХрд╕реНрдорд┐рдХ рд╡рд╛ рдЬрд╛рдирд╛рдЬрд╛рдиреА рдареВрд▓реЛ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВрдХреЛ рдШрдЯрдирд╛рдорд╛ рдХрд╛рд░реНрдпрд╣рд░реВрдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд▓рд╛рдИ рд╕рд░рд▓ рдмрдирд╛рдЙрдБрдЫред

Google API рд▓реЗ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд░ рдкреНрд░рд╛рдзрд┐рдХрд░рдгрдХреЛ рд▓рд╛рдЧрд┐ OAuth 2.0 рдкреНрд░реЛрдЯреЛрдХрд▓ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫред рдХреЗрд╕рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рдердк рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдгрд╣рд░реВ рдпрд╣рд╛рдБ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рд╕рдХрд┐рдиреНрдЫ: Google API рд╣рд░реВ рдкрд╣реБрдБрдЪ рдЧрд░реНрди OAuth 2.0 рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджреИ.

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

рддрд▓рдХреЛ рдЪрд┐рддреНрд░ рдЧреБрдЧрд▓ рдкреГрд╖реНрдардмрд╛рдЯ рдЪрдпрди рдЧрд░рд┐рдПрдХреЛ рдкрд░рд┐рджреГрд╢реНрдпрдХреЛ рдпреЛрдЬрдирд╛рдмрджреНрдз рд╡рд┐рд╡рд░рдг рд╣реЛред

API рдорд╛рд░реНрдлрдд PowerShell рдмрд╛рдЯ Google рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджреИ

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

  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 рдЧреНрд░рд╛рд╣рдХ рдкрд╣рд┐рдЪрд╛рдирдХрд░реНрддрд╛ рдЧреБрдгрд╣рд░реВрдорд╛ рдкреНрд░рд╛рдкреНрдд рдЧреНрд░рд╛рд╣рдХ ID рд░ рдЧреНрд░рд╛рд╣рдХ рдЧреЛрдкреНрдп рд╕реЗрдЯ рдЧрд░реНрдЫреМрдВ, рд░ рдХреЛрдб рдкреНрд░рдорд╛рдгрд┐рдХрд░рдг 43 рджреЗрдЦрд┐ 128 рд╡рд░реНрдгрд╣рд░реВрдХреЛ рд╕реНрдЯреНрд░рд┐рдЩ рд╣реЛ рдЬреБрди рдЕрдирд┐рдпрдорд┐рдд рд░реВрдкрдорд╛ рдЕрдирд╛рд░рдХреНрд╖рд┐рдд рд╡рд░реНрдгрд╣рд░реВрдмрд╛рдЯ рдЙрддреНрдкрдиреНрди рд╣реБрдиреБрдкрд░реНрдЫ: [AZ] / [az] / [0-9 ] / "-" / "ред" / "_" / "~"ред

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

рдЕрд░реНрдХреЛ, рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдкрдЫрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╣рд╛рдореАрд▓реЗ рд╕реНрдерд╛рдиреАрдп рдореЗрд╕рд┐рдирдорд╛ http рд╕реБрдиреНрди рд╕реБрд░реБ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рдЬреБрди рд░рд┐рдбрд┐рд░реЗрдХреНрдЯрдХреЛ рд░реВрдкрдорд╛ рдлрд░реНрдХрд╛рдЗрдиреЗрдЫред

рдкреНрд░рд╢рд╛рд╕рдирд┐рдХ рдХрд╛рд░реНрдпрд╣рд░реВ рд╡рд┐рд╢реЗрд╖ рд╕рд░реНрднрд░рдорд╛ рдЧрд░рд┐рдиреНрдЫ, рд╣рд╛рдореА рдзреЗрд░реИ рдкреНрд░рд╢рд╛рд╕рдХрд╣рд░реВрд▓реЗ рдПрдХреИ рд╕рдордпрдорд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдЙрдиреЗ рд╕рдореНрднрд╛рд╡рдирд╛рд▓рд╛рдИ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдЧрд░реНрди рд╕рдХреНрджреИрдиреМрдВ, рддреНрдпрд╕реИрд▓реЗ рдпрд╕рд▓реЗ рд╡рд░реНрддрдорд╛рди рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рдХреЛ рд▓рд╛рдЧрд┐ рдЕрдирд┐рдпрдорд┐рдд рд░реВрдкрдорд╛ рдкреЛрд░реНрдЯ рдЪрдпрди рдЧрд░реНрдиреЗрдЫ, рддрд░ рдореИрд▓реЗ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдкреЛрд░реНрдЯрд╣рд░реВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реЗрдХреЛ рдЫреБ рдХрд┐рдирднрдиреЗ рддрд┐рдиреАрд╣рд░реВ рдкрдирд┐ API рдХрдиреНрд╕реЛрд▓рдорд╛ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдкрдорд╛ рдердкрд┐рдиреБрдкрд░реНрдЫред

рдкрд╣реБрдБрдЪ_рдкреНрд░рдХрд╛рд░ = рдЕрдлрд▓рд╛рдЗрди рдпрд╕рдХреЛ рдорддрд▓рдм рдПрдкреНрд▓рд┐рдХреЗрд╕рдирд▓реЗ рдмреНрд░рд╛рдЙрдЬрд░рд╕рдБрдЧ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рдХреЛ рдЕрдиреНрддрд░реНрдХреНрд░рд┐рдпрд╛ рдмрд┐рдирд╛ рдиреИ рдореНрдпрд╛рдж рд╕рдХрд┐рдПрдХреЛ рдЯреЛрдХрди рдЕрдкрдбреЗрдЯ рдЧрд░реНрди рд╕рдХреНрдЫ,
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛_рдкреНрд░рдХрд╛рд░ = рдХреЛрдб рдХреЛрдб рдХрд╕рд░реА рдлрд░реНрдХрд╛рдЗрдиреЗрдЫ рднрдиреНрдиреЗ рдврд╛рдБрдЪрд╛ рд╕реЗрдЯ рдЧрд░реНрджрдЫ (рдкреБрд░рд╛рдиреЛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд╡рд┐рдзрд┐рдХреЛ рд╕рдиреНрджрд░реНрдн, рдЬрдм рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд▓реЗ рдмреНрд░рд╛рдЙрдЬрд░рдмрд╛рдЯ рд▓рд┐рдкрд┐рдорд╛ рдХреЛрдб рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдЧрд░реНрдпреЛ),
рдЧреБрдВрдЬрд╛рдЗрд╢ рдкрд╣реБрдБрдЪрдХреЛ рджрд╛рдпрд░рд╛ рд░ рдкреНрд░рдХрд╛рд░рд▓рд╛рдИ рд╕рдВрдХреЗрдд рдЧрд░реНрджрдЫред рддрд┐рдиреАрд╣рд░реВ рдЦрд╛рд▓реА рдард╛рдЙрдБ рд╡рд╛ %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
}

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

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

рд╕реНрдХреНрд░рд┐рдкреНрдЯрд▓реЗ рдлреЛрди рдирдореНрдмрд░ (рдПрдХ рдЕрдкреНрд░рдорд╛рдгрд┐рдд рд╕реНрдЯреНрд░рд┐рдЩ) рд░ рдХреНрд╖реЗрддреНрд░реАрдп рд╡рд┐рддрд░рдг рд╕рдореВрд╣рдорд╛ рд╕рдорд╛рд╡реЗрд╢рдХреЛ рд▓рд╛рдЧрд┐ рдкрдирд┐ рд╕реЛрдзреНрдиреЗрдЫред рдпрд╕рд▓реЗ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд▓рд╛рдИ рдЪрдпрди рдЧрд░рд┐рдПрдХреЛ рд╕рдХреНрд░рд┐рдп рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ 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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди