ΠšΡ€Π΅ΠΈΡ€Π°ΡšΠ΅ Π“ΠΎΠΎΠ³Π»Π΅ корисника ΠΈΠ· ΠŸΠΎΠ²Π΅Ρ€Π‘Ρ…Π΅Π»Π»-Π° ΠΏΡ€Π΅ΠΊΠΎ АПИ-ја

Π—Π΄Ρ€Π°Π²ΠΎ!

Овај Ρ‡Π»Π°Π½Π°ΠΊ Ρ›Π΅ описати ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Ρƒ ΠŸΠΎΠ²Π΅Ρ€Π‘Ρ…Π΅Π»Π» ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ†ΠΈΡ˜Π΅ са Π“ΠΎΠΎΠ³Π»Π΅ АПИ-јСм Π·Π° ΠΌΠ°Π½ΠΈΠΏΡƒΠ»Π°Ρ†ΠΈΡ˜Ρƒ Π“ Π‘ΡƒΠΈΡ‚Π΅ корисницима.

ΠšΠΎΡ€ΠΈΡΡ‚ΠΈΠΌΠΎ Π½Π΅ΠΊΠΎΠ»ΠΈΠΊΠΎ ΠΈΠ½Ρ‚Π΅Ρ€Π½ΠΈΡ… услуга ΠΈ услуга Ρƒ ΠΎΠ±Π»Π°ΠΊΡƒ ΡˆΠΈΡ€ΠΎΠΌ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΡ˜Π΅. Π£Π³Π»Π°Π²Π½ΠΎΠΌ сС Π°ΡƒΡ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΡ˜Π° Ρƒ њима своди Π½Π° Π“ΠΎΠΎΠ³Π»Π΅ ΠΈΠ»ΠΈ АцтивС Π”ΠΈΡ€Π΅Ρ†Ρ‚ΠΎΡ€ΠΈ, ΠΈΠ·ΠΌΠ΅Ρ’Ρƒ ΠΊΠΎΡ˜ΠΈΡ… Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌΠΎ ΠΎΠ΄Ρ€ΠΆΠ°Π²Π°Ρ‚ΠΈ Ρ€Π΅ΠΏΠ»ΠΈΠΊΡƒ, сходно Ρ‚ΠΎΠΌΠ΅, ΠΊΠ°Π΄Π° Π½ΠΎΠ²ΠΈ запослСни ΠΎΠ΄Π΅, ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎ јС Π΄Π° ΠΊΡ€Π΅ΠΈΡ€Π°Ρ‚Π΅/ΠΎΠΌΠΎΠ³ΡƒΡ›ΠΈΡ‚Π΅ Π½Π°Π»ΠΎΠ³ Ρƒ ΠΎΠ²Π° Π΄Π²Π° систСма. Π”Π° бисмо Π°ΡƒΡ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ процСс, ΠΎΠ΄Π»ΡƒΡ‡ΠΈΠ»ΠΈ смо Π΄Π° напишСмо скрипту која ΠΏΡ€ΠΈΠΊΡƒΠΏΡ™Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ˜Π΅ ΠΈ ΡˆΠ°Ρ™Π΅ ΠΈΡ… ΠΎΠ±Π΅ΠΌΠ° услугама.

ΠžΠ²Π»Π°ΡˆΡ›Π΅ΡšΠ΅

ΠŸΡ€ΠΈΠ»ΠΈΠΊΠΎΠΌ ΡΠ°ΡΡ‚Π°Π²Ρ™Π°ΡšΠ° Π·Π°Ρ…Ρ‚Π΅Π²Π° ΠΎΠ΄Π»ΡƒΡ‡ΠΈΠ»ΠΈ смо Π΄Π° користимо ΠΏΡ€Π°Π²Π΅ људскС администраторС Π·Π° Π°ΡƒΡ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΡ˜Ρƒ, ΡˆΡ‚ΠΎ ΠΏΠΎΡ˜Π΅Π΄Π½ΠΎΡΡ‚Π°Π²Ρ™ΡƒΡ˜Π΅ Π°Π½Π°Π»ΠΈΠ·Ρƒ ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡšΠ° Ρƒ ΡΠ»ΡƒΡ‡Π°Ρ˜Ρƒ ΡΠ»ΡƒΡ‡Π°Ρ˜Π½ΠΈΡ… ΠΈΠ»ΠΈ Π½Π°ΠΌΠ΅Ρ€Π½ΠΈΡ… масовних ΠΏΡ€ΠΎΠΌΠ΅Π½Π°.

Π“ΠΎΠΎΠ³Π»Π΅ АПИ-ји користС ΠžΠΡƒΡ‚Ρ… 2.0 ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» Π·Π° Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ˜Ρƒ ΠΈ Π°ΡƒΡ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΡ˜Ρƒ. Π‘Π»ΡƒΡ‡Π°Ρ˜Π΅Π²ΠΈ ΠΊΠΎΡ€ΠΈΡˆΡ›Π΅ΡšΠ° ΠΈ Π΄Π΅Ρ‚Π°Ρ™Π½ΠΈΡ˜ΠΈ описи ΠΌΠΎΠ³Ρƒ сС Π½Π°Ρ›ΠΈ ΠΎΠ²Π΄Π΅: ΠšΠΎΡ€ΠΈΡˆΡ›Π΅ΡšΠ΅ ΠžΠΡƒΡ‚Ρ… 2.0 Π·Π° приступ Π“ΠΎΠΎΠ³Π»Π΅ АПИ-јима.

Π˜Π·Π°Π±Ρ€Π°ΠΎ сам скрипту која сС користи Π·Π° Π°ΡƒΡ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΡ˜Ρƒ Ρƒ дСсктоп Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°ΠΌΠ°. ΠŸΠΎΡΡ‚ΠΎΡ˜ΠΈ ΠΈ ΠΎΠΏΡ†ΠΈΡ˜Π° ΠΊΠΎΡ€ΠΈΡˆΡ›Π΅ΡšΠ° Π½Π°Π»ΠΎΠ³Π° услугС, која Π½Π΅ Π·Π°Ρ…Ρ‚Π΅Π²Π° Π½Π΅ΠΏΠΎΡ‚Ρ€Π΅Π±Π½Π° ΠΊΡ€Π΅Ρ‚Π°ΡšΠ° ΠΎΠ΄ корисника.

Π‘Π»ΠΈΠΊΠ° испод јС ΡˆΠ΅ΠΌΠ°Ρ‚ΡΠΊΠΈ опис ΠΎΠ΄Π°Π±Ρ€Π°Π½ΠΎΠ³ ΡΡ†Π΅Π½Π°Ρ€ΠΈΡ˜Π° са Π“ΠΎΠΎΠ³Π»Π΅ страницС.

ΠšΡ€Π΅ΠΈΡ€Π°ΡšΠ΅ Π“ΠΎΠΎΠ³Π»Π΅ корисника ΠΈΠ· ΠŸΠΎΠ²Π΅Ρ€Π‘Ρ…Π΅Π»Π»-Π° ΠΏΡ€Π΅ΠΊΠΎ АПИ-ја

  1. ΠŸΡ€Π²ΠΎ ΡˆΠ°Ρ™Π΅ΠΌΠΎ корисника Π½Π° страницу Π·Π° ΠΏΠΎΡ‚Π²Ρ€Π΄Ρƒ аутСнтичности Π“ΠΎΠΎΠ³Π»Π΅ Π½Π°Π»ΠΎΠ³Π°, Π½Π°Π²ΠΎΠ΄Π΅Ρ›ΠΈ Π“Π•Π’ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅:
    • Π˜Π” Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π΅
    • области којима Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Ρ‚Ρ€Π΅Π±Π° приступ
    • адрСсу Π½Π° ΠΊΠΎΡ˜Ρƒ Ρ›Π΅ корисник Π±ΠΈΡ‚ΠΈ прСусмСрСн Π½Π°ΠΊΠΎΠ½ Π·Π°Π²Ρ€ΡˆΠ΅Π½ΠΎΠ³ поступка
    • Π½Π°Ρ‡ΠΈΠ½ Π½Π° који Ρ›Π΅ΠΌΠΎ Π°ΠΆΡƒΡ€ΠΈΡ€Π°Ρ‚ΠΈ Ρ‚ΠΎΠΊΠ΅Π½
    • Бигурносни ΠΊΠΎΠ΄
    • Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ прСноса Π²Π΅Ρ€ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΎΠ½ΠΎΠ³ ΠΊΠΎΠ΄Π°

  2. Након ΡˆΡ‚ΠΎ јС Π°ΡƒΡ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΡ˜Π° Π·Π°Π²Ρ€ΡˆΠ΅Π½Π°, корисник Ρ›Π΅ Π±ΠΈΡ‚ΠΈ прСусмСрСн Π½Π° страницу Π½Π°Π²Π΅Π΄Π΅Π½Ρƒ Ρƒ ΠΏΡ€Π²ΠΎΠΌ Π·Π°Ρ…Ρ‚Π΅Π²Ρƒ, са Π³Ρ€Π΅ΡˆΠΊΠΎΠΌ ΠΈΠ»ΠΈ ΠΊΠΎΠ΄ΠΎΠΌ Π·Π° Π°ΡƒΡ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΡ˜Ρƒ који су прослСђивали Π“Π•Π’ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ
  3. ΠΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° (скрипта) Ρ›Π΅ ΠΌΠΎΡ€Π°Ρ‚ΠΈ Π΄Π° ΠΏΡ€ΠΈΠΌΠΈ ΠΎΠ²Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ ΠΈ, Π°ΠΊΠΎ добијС ΠΊΠΎΠ΄, ΡƒΠΏΡƒΡ‚ΠΈ слСдСћи Π·Π°Ρ…Ρ‚Π΅Π² Π·Π° добијањС Ρ‚ΠΎΠΊΠ΅Π½Π°
  4. Ако јС Π·Π°Ρ…Ρ‚Π΅Π² Ρ‚Π°Ρ‡Π°Π½, Π“ΠΎΠΎΠ³Π»Π΅ АПИ Π²Ρ€Π°Ρ›Π°:
    • ΠŸΡ€ΠΈΡΡ‚ΡƒΠΏΠ½ΠΈ Ρ‚ΠΎΠΊΠ΅Π½ са којим ΠΌΠΎΠΆΠ΅ΠΌΠΎ Π΄Π° постављамо Π·Π°Ρ…Ρ‚Π΅Π²Π΅
    • ΠŸΠ΅Ρ€ΠΈΠΎΠ΄ ваТСња ΠΎΠ²ΠΎΠ³ Ρ‚ΠΎΠΊΠ΅Π½Π°
    • Π—Π° освСТавањС Ρ‚ΠΎΠΊΠ΅Π½Π° Π·Π° приступ ΠΏΠΎΡ‚Ρ€Π΅Π±Π°Π½ јС ΠΎΡΠ²Π΅ΠΆΠ°Π²Π°Ρ˜ΡƒΡ›ΠΈ Ρ‚ΠΎΠΊΠ΅Π½.

ΠŸΡ€Π²ΠΎ ΠΌΠΎΡ€Π°Ρ‚Π΅ Π΄Π° ΠΎΠ΄Π΅Ρ‚Π΅ Π½Π° Π“ΠΎΠΎΠ³Π»Π΅ АПИ ΠΊΠΎΠ½Π·ΠΎΠ»Ρƒ: АкрСдитиви – Π“ΠΎΠΎΠ³Π»Π΅ АПИ ΠΊΠΎΠ½Π·ΠΎΠ»Π°, ΠΈΠ·Π°Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΆΠ΅Ρ™Π΅Π½Ρƒ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Ρƒ ΠΈ Ρƒ ΠΎΠ΄Π΅Ρ™ΠΊΡƒ АкрСдитиви ΠΊΡ€Π΅ΠΈΡ€Π°Ρ˜Ρ‚Π΅ ΠΊΠ»ΠΈΡ˜Π΅Π½Ρ‚ΡΠΊΠΈ ΠžΠΡƒΡ‚Ρ… ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€. Π’Π°ΠΌΠΎ (ΠΈΠ»ΠΈ каснијС, Ρƒ ΡΠ²ΠΎΡ˜ΡΡ‚Π²ΠΈΠΌΠ° ΠΊΡ€Π΅ΠΈΡ€Π°Π½ΠΎΠ³ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°) ΠΌΠΎΡ€Π°Ρ‚Π΅ Π΄Π° Π½Π°Π²Π΅Π΄Π΅Ρ‚Π΅ адрСсС Π½Π° којС јС ΠΏΡ€Π΅ΡƒΡΠΌΠ΅Ρ€Π°Π²Π°ΡšΠ΅ Π΄ΠΎΠ·Π²ΠΎΡ™Π΅Π½ΠΎ. Π£ нашСм ΡΠ»ΡƒΡ‡Π°Ρ˜Ρƒ, Ρ‚ΠΎ Ρ›Π΅ Π±ΠΈΡ‚ΠΈ Π½Π΅ΠΊΠΎΠ»ΠΈΠΊΠΎ уноса Π»ΠΎΠΊΠ°Π»Π½ΠΎΠ³ хоста са Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΡ‚ΠΈΠΌ ΠΏΠΎΡ€Ρ‚ΠΎΠ²ΠΈΠΌΠ° (ΠΏΠΎΠ³Π»Π΅Π΄Π°Ρ˜Ρ‚Π΅ Π΄ΠΎΠ»Π΅).

Π”Π° бистС олакшали Ρ‡ΠΈΡ‚Π°ΡšΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° скриптС, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΈΠΊΠ°Π·Π°Ρ‚ΠΈ ΠΏΡ€Π²Π΅ ΠΊΠΎΡ€Π°ΠΊΠ΅ Ρƒ посСбној Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜ΠΈ која Ρ›Π΅ Π²Ρ€Π°Ρ‚ΠΈΡ‚ΠΈ Ρ‚ΠΎΠΊΠ΅Π½Π΅ Π·Π° приступ ΠΈ освСТавањС Π·Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Ρƒ:

$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

ΠŸΠΎΡΡ‚Π°Π²ΠΈΠ»ΠΈ смо Π¦Π»ΠΈΠ΅Π½Ρ‚ Π˜Π” ΠΈ Π¦Π»ΠΈΠ΅Π½Ρ‚ Π‘Π΅Ρ†Ρ€Π΅Ρ‚ добијСнС Ρƒ ΡΠ²ΠΎΡ˜ΡΡ‚Π²ΠΈΠΌΠ° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ΠžΠΡƒΡ‚Ρ… ΠΊΠ»ΠΈΡ˜Π΅Π½Ρ‚Π°, Π° Π²Π΅Ρ€ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΊΠΎΠ΄Π° јС Π½ΠΈΠ· ΠΎΠ΄ 43 Π΄ΠΎ 128 Π·Π½Π°ΠΊΠΎΠ²Π° који ΠΌΠΎΡ€Π° Π±ΠΈΡ‚ΠΈ насумично гСнСрисан ΠΎΠ΄ нСрСзСрвисаних Π·Π½Π°ΠΊΠΎΠ²Π°: [АЗ] / [Π°Π·] / [0-9 ] / "-" / "." / "_" / "~".

Овај ΠΊΠΎΠ΄ Ρ›Π΅ сС Π·Π°Ρ‚ΠΈΠΌ ΠΏΠΎΠ½ΠΎΠ²ΠΎ ΠΏΡ€Π΅Π½Π΅Ρ‚ΠΈ. Он СлиминишС Ρ€Π°ΡšΠΈΠ²ΠΎΡΡ‚ Ρƒ којој Π±ΠΈ Π½Π°ΠΏΠ°Π΄Π°Ρ‡ ΠΌΠΎΠ³Π°ΠΎ Π΄Π° прСсрСтнС ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ€ Π²Ρ€Π°Ρ›Π΅Π½ ΠΊΠ°ΠΎ ΠΏΡ€Π΅ΡƒΡΠΌΠ΅Ρ€Π°Π²Π°ΡšΠ΅ Π½Π°ΠΊΠΎΠ½ Π°ΡƒΡ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΡ˜Π΅ корисника.
ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΠΎΡˆΠ°Ρ™Π΅Ρ‚Π΅ Π²Π΅Ρ€ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΊΠΎΠ΄Π° Ρƒ Ρ‚Ρ€Π΅Π½ΡƒΡ‚Π½ΠΎΠΌ Π·Π°Ρ…Ρ‚Π΅Π²Ρƒ Ρƒ чистом тСксту (ΡˆΡ‚ΠΎ Π³Π° Ρ‡ΠΈΠ½ΠΈ бСсмислСним – ΠΎΠ²ΠΎ јС ΠΏΠΎΠ³ΠΎΠ΄Π½ΠΎ само Π·Π° систСмС који Π½Π΅ ΠΏΠΎΠ΄Ρ€ΠΆΠ°Π²Π°Ρ˜Ρƒ Π‘Π₯А256) ΠΈΠ»ΠΈ ΠΊΡ€Π΅ΠΈΡ€Π°ΡšΠ΅ΠΌ Ρ…Π΅Ρˆ користСћи Π‘Π₯А256 Π°Π»Π³ΠΎΡ€ΠΈΡ‚Π°ΠΌ, који ΠΌΠΎΡ€Π° Π±ΠΈΡ‚ΠΈ ΠΊΠΎΠ΄ΠΈΡ€Π°Π½ Ρƒ БАБЕ64Π£Ρ€Π» (Ρ€Π°Π·Π»ΠΈΠΊΡƒΡ˜Π΅ сС ΠΈΠ· БасС64 са Π΄Π²Π° Π·Π½Π°ΠΊΠ° Ρ‚Π°Π±Π΅Π»Π΅) ΠΈ ΡƒΠΊΠ»Π°ΡšΠ°ΡšΠ΅ΠΌ Π·Π°Π²Ρ€ΡˆΠ΅Ρ‚Π°ΠΊΠ° Ρ€Π΅Π΄ΠΎΠ²Π° Π·Π½Π°ΠΊΠΎΠ²Π°: =.

Π—Π°Ρ‚ΠΈΠΌ Ρ‚Ρ€Π΅Π±Π° Π΄Π° ΠΏΠΎΡ‡Π½Π΅ΠΌΠΎ Π΄Π° ΡΠ»ΡƒΡˆΠ°ΠΌΠΎ Ρ…Ρ‚Ρ‚ΠΏ Π½Π° локалној машини Π΄Π° бисмо Π΄ΠΎΠ±ΠΈΠ»ΠΈ ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ€ Π½Π°ΠΊΠΎΠ½ Π°ΡƒΡ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΡ˜Π΅, који Ρ›Π΅ Π±ΠΈΡ‚ΠΈ Π²Ρ€Π°Ρ›Π΅Π½ ΠΊΠ°ΠΎ ΠΏΡ€Π΅ΡƒΡΠΌΠ΅Ρ€Π°Π²Π°ΡšΠ΅.

Административни Π·Π°Π΄Π°Ρ†ΠΈ сС ΠΎΠ±Π°Π²Ρ™Π°Ρ˜Ρƒ Π½Π° посСбном сСрвСру, Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌΠΎ искључити могућност Π΄Π° Π½Π΅ΠΊΠΎΠ»ΠΈΠΊΠΎ администратора истоврСмСно ΠΏΠΎΠΊΡ€Π΅Ρ›Π΅ скрипту, ΠΏΠ° Ρ›Π΅ насумично Π±ΠΈΡ€Π°Ρ‚ΠΈ ΠΏΠΎΡ€Ρ‚ Π·Π° Ρ‚Ρ€Π΅Π½ΡƒΡ‚Π½ΠΎΠ³ корисника, Π°Π»ΠΈ сам Π½Π°Π²Π΅ΠΎ ΡƒΠ½Π°ΠΏΡ€Π΅Π΄ дСфинисанС ΠΏΠΎΡ€Ρ‚ΠΎΠ²Π΅ Ρ˜Π΅Ρ€ ΠΎΠ½ΠΈ Ρ‚Π°ΠΊΠΎΡ’Π΅ ΠΌΠΎΡ€Π°Ρ˜Ρƒ Π±ΠΈΡ‚ΠΈ Π΄ΠΎΠ΄Π°Ρ‚ΠΈ ΠΊΠ°ΠΎ ΠΏΠΎΡƒΠ·Π΄Π°Π½ΠΈ Ρƒ АПИ ΠΊΠΎΠ½Π·ΠΎΠ»ΠΈ.

аццСсс_Ρ‚ΠΈΠΏΠ΅=ΠΎΡ„Ρ„Π»ΠΈΠ½Π΅ Π·Π½Π°Ρ‡ΠΈ Π΄Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° ΠΌΠΎΠΆΠ΅ сама Π΄Π° Π°ΠΆΡƒΡ€ΠΈΡ€Π° Ρ‚ΠΎΠΊΠ΅Π½ који јС истСкао Π±Π΅Π· ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ†ΠΈΡ˜Π΅ корисника са ΠΏΡ€Π΅Π³Π»Π΅Π΄Π°Ρ‡Π΅ΠΌ,
рСспонсС_Ρ‚ΠΈΠΏΠ΅=Ρ†ΠΎΠ΄Π΅ поставља Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠΊΠ°ΠΊΠΎ Ρ›Π΅ ΠΊΠΎΠ΄ Π±ΠΈΡ‚ΠΈ Π²Ρ€Π°Ρ›Π΅Π½ (Ρ€Π΅Ρ„Π΅Ρ€Π΅Π½Ρ†Π° Π½Π° стари ΠΌΠ΅Ρ‚ΠΎΠ΄ Π°ΡƒΡ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΡ˜Π΅, ΠΊΠ°Π΄Π° јС корисник ΠΊΠΎΠΏΠΈΡ€Π°ΠΎ ΠΊΠΎΠ΄ ΠΈΠ· ΠΏΡ€Π΅Ρ‚Ρ€Π°ΠΆΠΈΠ²Π°Ρ‡Π° Ρƒ скрипту),
ΠΎΠ±ΠΈΠΌ ΠΎΠ·Π½Π°Ρ‡Π°Π²Π° ΠΎΠ±ΠΈΠΌ ΠΈ врсту приступа. ΠœΠΎΡ€Π°Ρ˜Ρƒ Π±ΠΈΡ‚ΠΈ Ρ€Π°Π·Π΄Π²ΠΎΡ˜Π΅Π½ΠΈ Ρ€Π°Π·ΠΌΠ°Ρ†ΠΈΠΌΠ° ΠΈΠ»ΠΈ %20 (ΠΏΡ€Π΅ΠΌΠ° Π£Π Π› ΠΊΠΎΠ΄ΠΈΡ€Π°ΡšΡƒ). Бписак приступних ΠΏΠΎΠ΄Ρ€ΡƒΡ‡Ρ˜Π° са Ρ‚ΠΈΠΏΠΎΠ²ΠΈΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΠΈ ΠΎΠ²Π΄Π΅: ΠžΠΡƒΡ‚Ρ… 2.0 ОпсСзи Π·Π° Π“ΠΎΠΎΠ³Π»Π΅ АПИ-јС.

Након ΡˆΡ‚ΠΎ ΠΏΡ€ΠΈΠΌΠΈ Π°ΡƒΡ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΎΠ½ΠΈ ΠΊΠΎΠ΄, Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Ρ›Π΅ Π²Ρ€Π°Ρ‚ΠΈΡ‚ΠΈ ΠΏΡ€Π΅Ρ‚Ρ€Π°ΠΆΠΈΠ²Π°Ρ‡Ρƒ ΠΏΠΎΡ€ΡƒΠΊΡƒ ΠΎ Π·Π°Ρ‚Π²Π°Ρ€Π°ΡšΡƒ, прСстати Π΄Π° ΡΠ»ΡƒΡˆΠ° ΠΏΠΎΡ€Ρ‚ ΠΈ послати ПОБВ Π·Π°Ρ…Ρ‚Π΅Π² Π·Π° добијањС Ρ‚ΠΎΠΊΠ΅Π½Π°. Π£ ΡšΠ΅ΠΌΡƒ Π½Π°Π²ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€Π΅Ρ‚Ρ…ΠΎΠ΄Π½ΠΎ Π½Π°Π²Π΅Π΄Π΅Π½ΠΈ ΠΈΠ΄ ΠΈ Ρ‚Π°Ρ˜Π½Ρƒ ΠΈΠ· АПИ-ја ΠΊΠΎΠ½Π·ΠΎΠ»Π΅, адрСсу Π½Π° ΠΊΠΎΡ˜Ρƒ Ρ›Π΅ корисник Π±ΠΈΡ‚ΠΈ прСусмСрСн ΠΈ Π³Ρ€Π°Π½Ρ‚_Ρ‚ΠΈΠΏΠ΅ Ρƒ складу са ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ˜ΠΎΠΌ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°.

Као ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ€, Π΄ΠΎΠ±ΠΈΡ›Π΅ΠΌΠΎ Ρ‚ΠΎΠΊΠ΅Π½ Π·Π° приступ, њСгов ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ ваТСња Ρƒ сСкундама ΠΈ Ρ‚ΠΎΠΊΠ΅Π½ Π·Π° освСТавањС, ΠΏΠΎΠΌΠΎΡ›Ρƒ којСг ΠΌΠΎΠΆΠ΅ΠΌΠΎ Π΄Π° Π°ΠΆΡƒΡ€ΠΈΡ€Π°ΠΌΠΎ Ρ‚ΠΎΠΊΠ΅Π½ Π·Π° приступ.

ΠΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° ΠΌΠΎΡ€Π° Π΄Π° Ρ‡ΡƒΠ²Π° Ρ‚ΠΎΠΊΠ΅Π½Π΅ Π½Π° Π±Π΅Π·Π±Π΅Π΄Π½ΠΎΠΌ мСсту са Π΄ΡƒΠ³ΠΈΠΌ Ρ€ΠΎΠΊΠΎΠΌ Ρ‚Ρ€Π°Ρ˜Π°ΡšΠ°, Ρ‚Π°ΠΊΠΎ Π΄Π° Π΄ΠΎΠΊ Π½Π΅ ΠΎΠΏΠΎΠ·ΠΎΠ²Π΅ΠΌΠΎ ΠΏΡ€ΠΈΠΌΡ™Π΅Π½ΠΈ приступ, Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π½Π΅Ρ›Π΅ Π²Ρ€Π°Ρ‚ΠΈΡ‚ΠΈ Ρ‚ΠΎΠΊΠ΅Π½ Π·Π° освСТавањС. На ΠΊΡ€Π°Ρ˜Ρƒ сам Π΄ΠΎΠ΄Π°ΠΎ Π·Π°Ρ…Ρ‚Π΅Π² Π·Π° ΠΎΠΏΠΎΠ·ΠΈΠ² Ρ‚ΠΎΠΊΠ΅Π½Π°; Π°ΠΊΠΎ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° нијС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π·Π°Π²Ρ€ΡˆΠ΅Π½Π° ΠΈ Ρ‚ΠΎΠΊΠ΅Π½ Π·Π° освСТавањС нијС Π²Ρ€Π°Ρ›Π΅Π½, ΠΏΠΎΠ½ΠΎΠ²ΠΎ Ρ›Π΅ ΠΏΠΎΠΊΡ€Π΅Π½ΡƒΡ‚ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ (сматрали смо Π΄Π° нијС Π±Π΅Π·Π±Π΅Π΄Π½ΠΎ Ρ‡ΡƒΠ²Π°Ρ‚ΠΈ Ρ‚ΠΎΠΊΠ΅Π½Π΅ Π»ΠΎΠΊΠ°Π»Π½ΠΎ Π½Π° Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Ρƒ, Π° ΠΌΠΈ Π½Π΅ Π½Π΅ ΠΆΠ΅Π»ΠΈΠΌ Π΄Π° ΠΊΠΎΠΌΠΏΠ»ΠΈΠΊΡƒΡ˜Π΅ΠΌ ствари са ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΡ˜ΠΎΠΌ ΠΈΠ»ΠΈ чСсто ΠΎΡ‚Π²Π°Ρ€Π°ΠΌ ΠΏΡ€Π΅Ρ‚Ρ€Π°ΠΆΠΈΠ²Π°Ρ‡).

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
}

Као ΡˆΡ‚ΠΎ стС Π²Π΅Ρ› ΠΏΡ€ΠΈΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ, ΠΏΡ€ΠΈΠ»ΠΈΠΊΠΎΠΌ ΠΎΠΏΠΎΠ·ΠΈΠ²Π° Ρ‚ΠΎΠΊΠ΅Π½Π°, користи сС ИнвокС-ВСбРСкуСст. Π—Π° Ρ€Π°Π·Π»ΠΈΠΊΡƒ ΠΎΠ΄ ИнвокС-Π Π΅ΡΡ‚ΠœΠ΅Ρ‚Ρ…ΠΎΠ΄, ΠΎΠ½ Π½Π΅ Π²Ρ€Π°Ρ›Π° ΠΏΡ€ΠΈΠΌΡ™Π΅Π½Π΅ ΠΏΠΎΠ΄Π°Ρ‚ΠΊΠ΅ Ρƒ ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Ρ™ΠΈΠ²ΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρƒ ΠΈ ΠΏΡ€ΠΈΠΊΠ°Π·ΡƒΡ˜Π΅ статус Π·Π°Ρ…Ρ‚Π΅Π²Π°.

Π—Π°Ρ‚ΠΈΠΌ, скрипта ΠΎΠ΄ вас Ρ‚Ρ€Π°ΠΆΠΈ Π΄Π° унСсСтС ΠΈΠΌΠ΅ ΠΈ ΠΏΡ€Π΅Π·ΠΈΠΌΠ΅ корисника, Π³Π΅Π½Π΅Ρ€ΠΈΡˆΡƒΡ›ΠΈ ΠΏΡ€ΠΈΡ˜Π°Π²Ρƒ + адрСсу Π΅-ΠΏΠΎΡˆΡ‚Π΅.

zahtevi

Π‘Π»Π΅Π΄Π΅Ρ›ΠΈ Π·Π°Ρ…Ρ‚Π΅Π²ΠΈ Ρ›Π΅ Π±ΠΈΡ‚ΠΈ – ΠΏΡ€Π΅ свСга, ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎ јС Π΄Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚Π΅ Π΄Π° Π»ΠΈ корисник са истим Π»ΠΎΠ³ΠΎΠΌ Π²Π΅Ρ› ΠΏΠΎΡΡ‚ΠΎΡ˜ΠΈ Π΄Π° бистС Π΄ΠΎΠ±ΠΈΠ»ΠΈ ΠΎΠ΄Π»ΡƒΠΊΡƒ ΠΎ ΠΊΡ€Π΅ΠΈΡ€Π°ΡšΡƒ Π½ΠΎΠ²ΠΎΠ³ ΠΈΠ»ΠΈ ΠΎΠΌΠΎΠ³ΡƒΡ›Π°Π²Π°ΡšΡƒ ΠΏΠΎΡΡ‚ΠΎΡ˜Π΅Ρ›Π΅Π³.

ΠžΠ΄Π»ΡƒΡ‡ΠΈΠΎ сам Π΄Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°ΠΌ свС Π·Π°Ρ…Ρ‚Π΅Π²Π΅ Ρƒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρƒ јСднС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π΅ са ΠΈΠ·Π±ΠΎΡ€ΠΎΠΌ, користСћи ΠΏΡ€Π΅ΠΊΠΈΠ΄Π°Ρ‡:

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
}

Π—Π°Ρ…Ρ‚Π΅Π² Π΅ΠΌΠ°ΠΈΠ»:$ΠΊΡƒΠ΅Ρ€ΠΈ Ρ›Π΅ Ρ‚Ρ€Π°ΠΆΠΈΡ‚ΠΈ ΠΎΠ΄ АПИ-ја Π΄Π° ΠΏΠΎΡ‚Ρ€Π°ΠΆΠΈ корисника са ΡƒΠΏΡ€Π°Π²ΠΎ Ρ‚ΠΎΠΌ Π΅-ΠΏΠΎΡˆΡ‚ΠΎΠΌ, ΡƒΠΊΡ™ΡƒΡ‡ΡƒΡ˜ΡƒΡ›ΠΈ псСудонимС. Π’Π°ΠΊΠΎΡ’Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ користити ΡŸΠΎΠΊΠ΅Ρ€ Π·Π½Π°ΠΊ: =, :, :{ΠŸΠ Π•Π€Π˜ΠšΠ‘}*.

Π—Π° добијањС ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° користитС ΠΌΠ΅Ρ‚ΠΎΠ΄ Π“Π•Π’ Π·Π°Ρ…Ρ‚Π΅Π²Π°, Π·Π° ΡƒΠ±Π°Ρ†ΠΈΠ²Π°ΡšΠ΅ ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° (ΠΊΡ€Π΅ΠΈΡ€Π°ΡšΠ΅ Π½Π°Π»ΠΎΠ³Π° ΠΈΠ»ΠΈ додавањС Ρ‡Π»Π°Π½Π° Ρƒ Π³Ρ€ΡƒΠΏΡƒ) - ПОБВ, Π·Π° Π°ΠΆΡƒΡ€ΠΈΡ€Π°ΡšΠ΅ ΠΏΠΎΡΡ‚ΠΎΡ˜Π΅Ρ›ΠΈΡ… ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° - ПУВ, Π·Π° Π±Ρ€ΠΈΡΠ°ΡšΠ΅ записа (Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‡Π»Π°Π½Π° ΠΈΠ· Π³Ρ€ΡƒΠΏΠ΅) - Π˜Π—Π‘Π Π˜Π¨Π˜.

Π‘ΠΊΡ€ΠΈΠΏΡ‚Π° Ρ›Π΅ Ρ‚Π°ΠΊΠΎΡ’Π΅ Ρ‚Ρ€Π°ΠΆΠΈΡ‚ΠΈ Π±Ρ€ΠΎΡ˜ Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π° (Π½Π΅ΠΏΠΎΡ‚Π²Ρ€Ρ’Π΅Π½ стринг) ΠΈ ΡƒΠΊΡ™ΡƒΡ‡ΠΈΠ²Π°ΡšΠ΅ Ρƒ Ρ€Π΅Π³ΠΈΠΎΠ½Π°Π»Π½Ρƒ Π³Ρ€ΡƒΠΏΡƒ Π·Π° Π΄ΠΈΡΡ‚Ρ€ΠΈΠ±ΡƒΡ†ΠΈΡ˜Ρƒ. ΠžΠ΄Π»ΡƒΡ‡ΡƒΡ˜Π΅ ΠΊΠΎΡ˜Ρƒ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΎΠ½Ρƒ Ρ˜Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ корисник Ρ‚Ρ€Π΅Π±Π° Π΄Π° ΠΈΠΌΠ° Π½Π° основу ΠΈΠ·Π°Π±Ρ€Π°Π½ΠΎΠ³ АцтивС Π”ΠΈΡ€Π΅Ρ†Ρ‚ΠΎΡ€ΠΈ ОУ ΠΈ доноси Π»ΠΎΠ·ΠΈΠ½ΠΊΡƒ:

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
}

Π€ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π΅ Π·Π° Π°ΠΆΡƒΡ€ΠΈΡ€Π°ΡšΠ΅ ΠΈ ΠΊΡ€Π΅ΠΈΡ€Π°ΡšΠ΅ Π½Π°Π»ΠΎΠ³Π° ΠΈΠΌΠ°Ρ˜Ρƒ сличну синтаксу, нису ΠΏΠΎΡ‚Ρ€Π΅Π±Π½Π° сва Π΄ΠΎΠ΄Π°Ρ‚Π½Π° ΠΏΠΎΡ™Π°, Ρƒ ΠΎΠ΄Π΅Ρ™ΠΊΡƒ са Π±Ρ€ΠΎΡ˜Π΅Π²ΠΈΠΌΠ° Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π° ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎ јС Π΄Π° Π½Π°Π²Π΅Π΄Π΅Ρ‚Π΅ Π½ΠΈΠ· који ΠΌΠΎΠΆΠ΅ Π΄Π° садрТи Π΄ΠΎ јСдног записа са Π±Ρ€ΠΎΡ˜Π΅ΠΌ ΠΈ њСговим Ρ‚ΠΈΠΏΠΎΠΌ.

Π”Π° Π½Π΅ бисмо Π΄ΠΎΠ±ΠΈΠ»ΠΈ Π³Ρ€Π΅ΡˆΠΊΡƒ ΠΏΡ€ΠΈΠ»ΠΈΠΊΠΎΠΌ додавања корисника Ρƒ Π³Ρ€ΡƒΠΏΡƒ, ΠΏΡ€Π²ΠΎ ΠΌΠΎΠΆΠ΅ΠΌΠΎ Π΄Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌΠΎ Π΄Π° Π»ΠΈ јС Π²Π΅Ρ› Ρ‡Π»Π°Π½ ΠΎΠ²Π΅ Π³Ρ€ΡƒΠΏΠ΅ Ρ‚Π°ΠΊΠΎ ΡˆΡ‚ΠΎ Ρ›Π΅ΠΌΠΎ ΠΎΠ΄ самог корисника Π΄ΠΎΠ±ΠΈΡ‚ΠΈ листу Ρ‡Π»Π°Π½ΠΎΠ²Π° Π³Ρ€ΡƒΠΏΠ΅ ΠΈΠ»ΠΈ састав.

ΠŸΠΎΡΡ‚Π°Π²Ρ™Π°ΡšΠ΅ ΡƒΠΏΠΈΡ‚Π° ΠΎ чланству Ρƒ Π³Ρ€ΡƒΠΏΠΈ ΠΎΠ΄Ρ€Π΅Ρ’Π΅Π½ΠΎΠ³ корисника Π½Π΅Ρ›Π΅ Π±ΠΈΡ‚ΠΈ Ρ€Π΅ΠΊΡƒΡ€Π·ΠΈΠ²Π½ΠΎ ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Ρ›Π΅ само Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ чланство. Π£ΠΊΡ™ΡƒΡ‡ΠΈΠ²Π°ΡšΠ΅ корисника Ρƒ родитСљску Π³Ρ€ΡƒΠΏΡƒ која Π²Π΅Ρ› ΠΈΠΌΠ° ΠΏΠΎΠ΄Ρ€Π΅Ρ’Π΅Π½Ρƒ Π³Ρ€ΡƒΠΏΡƒ Ρ‡ΠΈΡ˜ΠΈ јС корисник Ρ‡Π»Π°Π½ Ρ›Π΅ успСти.

Π—Π°ΠΊΡ™ΡƒΡ‡Π°ΠΊ

ΠžΡΡ‚Π°Ρ˜Π΅ само Π΄Π° ΠΏΠΎΡˆΠ°Ρ™Π΅Ρ‚Π΅ кориснику Π»ΠΎΠ·ΠΈΠ½ΠΊΡƒ Π·Π° Π½ΠΎΠ²ΠΈ Π½Π°Π»ΠΎΠ³. Π’ΠΎ Ρ€Π°Π΄ΠΈΠΌΠΎ ΠΏΡƒΡ‚Π΅ΠΌ БМБ-Π°, Π° ΠΎΠΏΡˆΡ‚Π΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ˜Π΅ са упутствима ΠΈ ΠΏΡ€ΠΈΡ˜Π°Π²ΠΎΠΌ ΡˆΠ°Ρ™Π΅ΠΌΠΎ Π½Π° Π»ΠΈΡ‡Π½ΠΈ Π΅-ΠΌΠ°ΠΈΠ», који јС, ΡƒΠ· Π±Ρ€ΠΎΡ˜ Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π°, Π΄Π°ΠΎ ΠΎΠ΄Π΅Ρ™Π΅ΡšΠ΅ Π·Π° Π·Π°ΠΏΠΎΡˆΡ™Π°Π²Π°ΡšΠ΅. Као Π°Π»Ρ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρƒ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡˆΡ‚Π΅Π΄Π΅Ρ‚ΠΈ Π½ΠΎΠ²Π°Ρ† ΠΈ послати ΡΠ²ΠΎΡ˜Ρƒ Π»ΠΎΠ·ΠΈΠ½ΠΊΡƒ Ρƒ Ρ‚Π°Ρ˜Π½ΠΈ Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ Ρ›Π°ΡΠΊΠ°ΡšΠ΅, ΡˆΡ‚ΠΎ сС Ρ‚Π°ΠΊΠΎΡ’Π΅ ΠΌΠΎΠΆΠ΅ сматрати Π΄Ρ€ΡƒΠ³ΠΈΠΌ Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΎΠΌ (ΠœΠ°Ρ†Π‘ΠΎΠΎΠΊΡ Ρ›Π΅ Π±ΠΈΡ‚ΠΈ ΠΈΠ·ΡƒΠ·Π΅Ρ‚Π°ΠΊ).

Π₯Π²Π°Π»Π° Π²Π°ΠΌ ΡˆΡ‚ΠΎ стС ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π»ΠΈ Π΄ΠΎ ΠΊΡ€Π°Ρ˜Π°. Π‘ΠΈΡ›Π΅ ΠΌΠΈ Π΄Ρ€Π°Π³ΠΎ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΠΏΡ€Π΅Π΄Π»ΠΎΠ³Π΅ Π·Π° ΠΏΠΎΠ±ΠΎΡ™ΡˆΠ°ΡšΠ΅ стила писања Ρ‡Π»Π°Π½Π°ΠΊΠ° ΠΈ ΠΆΠ΅Π»ΠΈΠΌ Π²Π°ΠΌ Π΄Π° ΡƒΡ…Π²Π°Ρ‚ΠΈΡ‚Π΅ мањС Π³Ρ€Π΅ΡˆΠ°ΠΊΠ° ΠΏΡ€ΠΈ ΠΏΠΈΡΠ°ΡšΡƒ скрипти =)

Бписак Π»ΠΈΠ½ΠΊΠΎΠ²Π° који ΠΌΠΎΠ³Ρƒ Π±ΠΈΡ‚ΠΈ тСматски корисни ΠΈΠ»ΠΈ Ρ˜Π΅Π΄Π½ΠΎΡΡ‚Π°Π²Π½ΠΎ ΠΎΠ΄Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΠΈ Π½Π° ΠΏΠΈΡ‚Π°ΡšΠ°:

Π˜Π·Π²ΠΎΡ€: Π²Π²Π².Ρ…Π°Π±Ρ€.Ρ†ΠΎΠΌ

Π”ΠΎΠ΄Π°Ρ˜ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€