ααααΆααα½α!
α’ααααααααααΉααα·αααααΆα’αααΈααΆαα’αα»ααααα’αααααααα PowerShell ααΆαα½α Google API ααΎααααΈαααα αα’αααααααΎααααΆαα G Suite α
ααΎαααααΎααααΆααααααΆααααααΆααααα»α αα·ααααααΆα
αααΎααα
ααΌααΆααααααΆαααα αααααΆαααααααααΆαα
αααΎα ααΆαα’αα»ααααΆααα
αααα»ααα½αααΆααααΎ Google α¬ Active Directory ααααααΆαααΎααα·αα’αΆα
αααααΆααΆαα
ααααααΆααα α’αΆαααααα ααα»ααα αα
αααααααα»ααααα·αααααΈα
αΆαα
αα α’αααααααΌααααααΎα/ααΎαααααΈαα
αααα»αααααααααααΆααααΈααααα ααΎααααΈααααΎα±ααααααΎαααΆααααααααααααααααα· ααΎαααΆααααααα
α
α·ααααααααααααααΈαααααααααΌαααααααΆα α αΎαααααΎααΆαα
ααααΆααααααΆααααΈαα
ααΆαα’αα»ααααΆα
αα ααααααααΎααααααααααααααΌα ααΎαααΆααααααα α α·αααααααΎα’ααααααααααααααα»ααααα·αααααΆαααααααΆααααΆαα’αα»ααααΆα αααααααΎα±ααααΆααα·ααΆααααααααΆαααΆαααΆαααΆααααα½ααααα»αααααΈααΆαααΆαααααΆααααααΌααααααααα ααααα α¬αααα ααααΆα
Google APIs ααααΎαα·ααΈααΆα OAuth 2.0 αααααΆααααΆααααααααααΆαα αα·αααΆαα’αα»ααααΆαα ααααΈααααΎααααΆαα αα·αααΆααα·αααααΆαααα’α·ααααααααααα’αΆα
ααααΆααα
ααΈαααα
αααα»αααΆαααααΎαααΎαααααααΈααααααααΎαααααΆααααΆαα’αα»ααααΆααααα»ααααααα·ααΈαα»αααααΌαααα ααΆααααΆααααααΎααααα»αααΆαααααΎααααΈααααΆααααααααα ααααα·ααααααΌαα±ααααΆαα αααΆααααα·αα αΆαααΆα αααΈα’αααααααΎααααΆααα
ααΌαααΆαααΆααααααααΊααΆααΆααα·αααααΆαααααααΆαααααααααΆααΈαααΌαααααΆαααααΎαααΎαααΈααααα Google α
- ααααΌα ααΎααααααΌαα’αααααααΎααααΆαααα
ααΆααααααααααααααααΆααααααΈ Google ααααααααΆαααααΆαααΆαααααα GETα
- ααααααααΆαααααααα·ααΈ
- αααααααααααααα·ααΈααααΌαααΆαα αΌαααααΎ
- α’αΆααααααΆααααα’αααααααΎααααΆααααΉαααααΌαααΆααααααΌααααααααααΆααααΈαααα ααααΈαα·αα·ααΈ
- αα·ααΈαααααΎαααΉαααααΎαα αα α»ααααααααΆααα·αα·ααααααααΆ
- αααααααΆαα
- αααααααααααΌαααΌααααααααααΆαα
- αααααΆααααΈααΆαα’αα»ααααΆαααααΌαααΆααααα αα α’αααααααΎααααΆααααΉαααααΌαααΆααααααΌααααααα ααΆααααααααααααΆααααααΆαααα αααα»αααααΎααααΌααααααΆαααα α»α α¬αααααΌαα’αα»ααααΆααααααΆαααααααΆααααααααΆαααΆαααααα GET
- αααααα·ααΈ (ααααααΈα) ααΉαααααΌαααΆαααα½ααααΆαααΆααααααααΆααααα α αΎαααααα·αααΎααΆαααα½ααααααΌα ααΌαααααΎααΆαααααΎαα»αααΆααααααααΎααααΈααα½αααΆαααΌααΉα
- ααααα·αααΎααααΎαααααααΉαααααΌα Google API αααα‘αααααα·αα
- αααααΆαααααΆααα αΌαααααΎ αααααΎαα’αΆα ααααΎααΆαααααΎαα»αααΆαα
- αααααααα»ααααΆααααααααΆαααααΆαααααα
- αααααΌαβα±ααβαααα»αβαααααΆβαααααΆααβα‘αΎααα·α ααΎααααΈβαααα»αβαααααΆβα αΌαβααααΎαααΆαβα‘αΎααα·αα
ααααΌαα’αααααααΌαα
αΌααα
ααΆαααα»αααΌα Google APIα
ααΎααααΈααααΎα±ααααΆααΆααααααΆααααα½ααααα»αααΆαα’αΆααααα½ααααααααΆαααααααΈα α’αααα’αΆα αααα αΆαααα αΆαααααΌααα αααα»ααα»αααΆαααΆα ααααα‘αααααααΉααααα‘ααααΆαα αΌαααααΎ αα·αααααΎα±ααααΌααΉαααααααααααΆαααααααα·ααΈα
$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) α¬ααααααααΎα hash αααααααΎαααα½ααααααααΆα SHA256 αααααααΌααααααα
αΌαααΌααααα»α BASE64Url (αα»αααααΆ ααΈ Base64 ααααα½α’ααααααΆααΆαααΈα) αα·αααα
ααααΆααααα
αααααααΆαααα½α’αααα: = α
αααααΆαααα ααΎαααααΌαα αΆααααααΎαααααΆαα http αα ααΎαααΆαααΈαααΌαααααΆα ααΎααααΈααα½αααΆαααΆαααααΎααααααααΆααααΈααΆαα’αα»ααααΆα αααααΉαααααΌαααΆααααααΌααααα·αααΆααΆααααααΌαααααα
αα·α αα ααΆαααααααΆαααααΌαααΆαα’αα»αααααα ααΎαααΆαααΈααααα·ααα ααΎααα·αα’αΆα ααα·αααααααααΆααααα’ααααααααααααααΆα αααΎαααΉαααααΎαααΆαααααααΈααααα»αααααααα½ααα ααΌα ααααααΆααΉαααααΎαααΎαα ααααααααΆααα’αααααααΎααααΆαααα αα α»αααααααααα ααααα ααα»αααααααα»αααΆααααααΆααα ααααααααΆααααααααΆαα»αααααα αα½αααααααααΌαααααααΌαααΆαααααααααΆααΏαα»αα α·ααααα αααα»ααα»αααΌα API αααααα
access_type=ααααΆαα’ααΈαααΊαα·α ααΆαβαααβααΆβαααααα·ααΈβα’αΆα
βααααΎβαα
αα
α»ααααααααΆαβααΌααΉαβαααβαα»αβαααααβαααβαααα½αβα―αβαααβαα·αβα
αΆαααΆα
αβααΆαβα’ααααααααβααΆαα½αβα’αααβααααΎβααΆαα½αβαααααα·ααΈβαα»ααα
response_type=ααΌα αααααβααααααβααβααααβαααβααΌαβααΉαβααααΌαβααΆαβαααααΌαβααβαα·α (αααβαα
βααΎβαα·ααΈααΆαααααβαααααβαα·αααα·βα
αΆαα αααβα’αααβααααΎβα
ααααβααΌαβααΈβαααααα·ααΈβαα»αααβαα
βαααα»αβααααααΈα)
αα·ααΆαααΆα αααα αΆαααΈαα·ααΆαααΆα αα·αααααααααααΆαα
αΌαααααΎααααΆααα αα½αααααααΌαααααααααααααααααΆ α¬ %20 (αααααΆαααΆαα’αα·αααΌα URL)α αααααΈαααααααα
αΌαααααΎααΆαα½αααααααα’αΆα
ααααΌαααΆαααααΎαααΎααα
ααΈαααα
αααααΆααααΈααα½αααΆααααααΌαα’αα»ααααΆα αααααα·ααΈααΉααααα‘ααααΆααα·ααα αααααα·ααΈαα»ααα αααααααΆαααα ααΎα ααα αα·αααααΎααααΎ 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 request ααΉααα½α API α±αααααααααα’αααααααΎααααΆαααααααΆαα’ααΈαααααα αα½αααΆααααααααααααααααΆααααααα α’αααααα’αΆα ααααΎα’αααααααα½αα =, :, :{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
}
αα»αααΆααααααΆααα’αΆααααα αα·ααααααΎαααααΈααΆαααΆαααααααααααααααααααααΆ αα·αααααααααααΆαααααααααΆααα’ααααααΌαααΆαααΆαααΆααα αα αααα»αααααααααααΆααααααΌαααααα α’αααααααΌααααααΆααα’αΆαααααα’αΆα ααΆααααααααααΆαα αΌαααααα½αααΆαα½αααΉαααα αα·αααααααααααααΆα
ααΎααααΈβαα·αβααα½αβααΆαβααα α»αβαααβααααααβα’αααβααααΎβαα βαααα»αβαααα»αβααααΌαβααΎαβα’αΆα βαα·αα·αααβααΎαβααΆβααΎβααΆααβααΊβααΆβαααΆαα·αβαααα»αβαααβαα½α βα αΎαβαααβααα½αβααΆαβαααααΈβαααΆαα·αβαααα»αβα¬βαααΆαααΆαβααΈβα’αααβααααΎβαααα½αβααΆααβααααΆααα
ααΆαααΆααα½ααααΆαα·αααΆααααα»αααααα’αααααααΎααααΆααααΆααααΆααααΉααα·αααΎαα‘αΎααα·ααα α αΎαααΉααααα αΆααααααΆαα·αααΆαααααΆααααα»αααααα αα½αααΆααα’αααααααΎααααΆαααα αααα»ααααα»ααααααααΆααααα»αααΌααα½α α αΎα αααα’αααααααΎααααΆααααΆαααΆαα·αααΉαααα½αααΆαααααααα
ααα ααααΈααααα·ααααΆα
α’αααΈβαααβαα βαααβααΊβααααΌαβααααΎβαααβαααααΆααβα±ααβα’αααβααααΎβαααααΆααβααααΈβααααΈα ααΎαααααΎααΌα αααααΆααααααΆα SMS α αΎαααααΎααααααΆαααΌαα ααΆαα½αααΉαααΆαααααΆα αα·αα αΌααα ααΆααα’ααΈαααααααΆαααααα½α ααααα½αααΆαα½ααααααΌααααααααααΌαααΆαααααααααααΆααααααΆαααααΎαααΎααα»ααααα·αα ααΆαααααΎααα½α α’αααα’αΆα αααααααααΆαα αα·αααααΎααΆααααααααΆααααααα’ααααα ααΆαααααααΆαααΌαααααααααΆαα αααα’αΆα α αΆαααα»αααΆααΆαααααΆααΈααΈαααααα (MacBooks ααΉαααΆααααΈααΎαααα)α
α’ααα»ααααααΆααααΆαα’αΆααααα ααα αααα»αααΉαααΈαααΆααααα»αααΆαααΎαααΆααααααααααααααααΆααααΆααααααα’αα ααΆαααααααααΆααααααα’ααααα α αΎαααΌαααΌαααα±ααα’αααα αΆααααα α»ααα·α ααΆααα»ααα ααααααααααααααΈα =)
αααααΈαααααααααΆαααααα’αΆα ααΆαααααααααααΆααααααΆααα α¬ααααΆααααααααΎααααα½αα
OAuth 2.0 αααααΆαααααααα·ααΈααΌαααααα αα·ααα»αααααΌααα ααΆαααααΎααααΆαα OAuth 2.0 αααααΆαααααααα·ααΈ Web Server αααααααα»ααΆααααααΆααααΆαααααΆααααααΌααααααΌααααα’αα·αα·ααααΆααΆααα OAuth αααααΎαα’ααααα αααααααΆαα½α PowerShell ααΆααΆα ASCII αα·αααΆααα·αααααΆ PowerShellα ααα½αααΆαααααα hash αααααΆααααααα’αααα α’αα·αααΌα/αα·ααΌα Base64Url ααΆαα’αα·αααΌα Base64 αααααΉαααΆαα’αα·αααΌα Base64url Invoke-RestMethod αααα»α PowerShell 5.1 αα·αααα½αααΆαααΌααΉαααααΎα±ααααααααα αααααΈααΆ access_type αα·αααΆαα’ααΈαααΊαα·ααααα»αααα αΆαααΈ 1 αααααα α’αααΈααααα·ααααα·αααααααααα Directory APIα ααααΈα’αααααααΎααααΆαα αααααααα’αααααααΎααααΆαα Directory API: αααα»α ααΆααααααααΆαααα α»ααααααΆαα Invoke-RestMethod - Powershell
ααααα: www.habr.com