Hello!
เบเบปเบเบเบงเบฒเบกเบเบตเปเบเบฐเบญเบฐเบเบดเบเบฒเบเบเบฒเบเบเบฐเบเบดเบเบฑเบเบเบฒเบเปเบเปเบเบญเบ PowerShell เบเบฑเบ Google API เปเบเบทเปเบญเบเบฑเบเบเบฒเบเบเบนเปเปเบเป G Suite.
เบเบงเบเปเบฎเบปเบฒเปเบเปเบเปเบฅเบดเบเบฒเบเบเบฒเบเปเบ เปเบฅเบฐเบเบฅเบฒเบงเบซเบผเบฒเบเบญเบฑเบเปเบเบเบปเปเบงเบญเบปเบเบเบญเบ. เบชเปเบฒเบฅเบฑเบเบชเปเบงเบเปเบซเบเป, เบเบฒเบเบญเบฐเบเบธเบเบฒเบเปเบเบเบงเบเบกเบฑเบเปเบกเปเบเบกเบฒเบเบฒเบ Google เบซเบผเบท Active Directory, เบฅเบฐเบซเบงเปเบฒเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเบเปเปเบชเบฒเบกเบฒเบเบฎเบฑเบเบชเบฒเบเบฒเบเบเปเบฒเบฅเบญเบ; เบเบฑเปเบเบเบฑเปเบ, เปเบกเบทเปเบญเบเบฐเบเบฑเบเบเบฒเบเปเบซเบกเปเบญเบญเบเปเบ, เบเปเบฒเบเบเปเบฒเปเบเบฑเบเบเปเบญเบเบชเปเบฒเบ / เปเบเบตเบเปเบเปเบเบฑเบเบเบตเปเบเบชเบญเบเบฅเบฐเบเบปเบเบเบตเป. เปเบเบทเปเบญเบญเบฑเบเบเบฐเปเบเบกเบฑเบเบเบฐเบเบงเบเบเบฒเบ, เบเบงเบเปเบฎเบปเบฒเปเบเปเบเบฑเบเบชเบดเบเปเบเบเบฝเบเบชเบฐเบเบดเบเบเบตเปเปเบเบฑเบเบเปเบฒเบเปเปเบกเบนเบเปเบฅเบฐเบชเบปเปเบเปเบซเปเบเบฑเบเบชเบญเบเบเปเบฅเบดเบเบฒเบ.
เบเบฒเบเบญเบฐเบเบธเบเบฒเบ
เปเบกเบทเปเบญเบชเปเบฒเบเบเบงเบฒเบกเบเปเบญเบเบเบฒเบ, เบเบงเบเปเบฎเบปเบฒเปเบเปเบเบฑเบเบชเบดเบเปเบเบเปเบฒเปเบเปเบเบนเปเบเปเบฅเบดเบซเบฒเบเบเบญเบเบกเบฐเบเบธเบเบเบตเปเปเบเปเบเบดเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเบญเบฐเบเบธเบเบฒเบ; เบเบตเปเปเบฎเบฑเบเปเบซเปเบเบฒเบเบงเบดเปเบเบฒเบฐเบเบฒเบเบเปเบฒเปเบเบตเบเบเบฒเบเบเปเบฒเบเบเบถเปเบเปเบเบเปเบฅเบฐเบเบตเบเบตเปเบกเบตเบเบฒเบเบเปเบฝเบเปเบเบเบเบฐเบซเบเบฒเบเปเบซเบเปเปเบเบเบเบฑเบเปเบญเบตเบเบซเบผเบทเปเบเบเปเบเบเบเบฐเบเบฒ.
Google APIs เปเบเปเปเบเบฃเปเบเบเป OAuth 2.0 เบชเบณเบฅเบฑเบเบเบฒเบเบเบดเบชเบนเบเบขเบทเบเบขเบฑเบ เปเบฅเบฐเบญเบฐเบเบธเบเบฒเบ. เบเปเบฅเบฐเบเบตเบเบฒเบเบเบณเปเบเป เปเบฅเบฐเบฅเบฒเบเบฅเบฐเบญเบฝเบเปเบเบตเปเบกเปเบเบตเบกเบชเบฒเบกเบฒเบเบเบปเบเปเบเปเบเบตเปเบเบตเป:
เบเปเบฒเบเบฐเปเบเบปเปเบฒเปเบเปเปเบฅเบทเบญเบเบชเบฐเบเบดเบเบเบตเปเปเบเปเบชเปเบฒเบฅเบฑเบเบเบฒเบเบญเบฐเบเบธเบเบฒเบเปเบเบเปเบฒเบฎเปเบญเบเบชเบฐเบซเบกเบฑเบ desktop. เบเบฑเบเบกเบตเบเบฒเบเปเบฅเบทเบญเบเบเบตเปเบเบฐเบเปเบฒเปเบเปเบเบฑเบเบเบตเบเปเบฅเบดเบเบฒเบ, เปเบเบดเปเบเบเปเปเบเปเบฒเปเบเบฑเบเบเปเบญเบเบกเบตเบเบฒเบเปเบเบทเปเบญเบเปเบซเบงเบเบตเปเบเปเปเบเปเบฒเปเบเบฑเบเบเบฒเบเบเบนเปเปเบเป.
เบฎเบนเบเบเบฒเบเบเปเบฒเบเบฅเบธเปเบกเบเบตเปเปเบกเปเบเบเปเบฒเบญเบฐเบเบดเบเบฒเบเปเบเบเปเบเบเบเบญเบเบชเบฐเบเบฒเบเบฐเบเบฒเบเบเบตเปเปเบฅเบทเบญเบเบเบฒเบเบซเบเปเบฒ Google.
- เบเปเบฒเบญเบดเบ, เบเบงเบเปเบฎเบปเบฒเบชเบปเปเบเบเบนเปเปเบเปเปเบเบซเบฒเบซเบเปเบฒเบเบฒเบเบเบงเบเบชเบญเบเบเบฑเบเบเบต Google, เบฅเบฐเบเบธเบเบฒเบฅเบฒเบกเบดเปเบเบต GET:
- เปเบญเบเบตเปเบญเบฑเบเบเบฅเบดเปเบเบเบฑเบ
- เบเบทเปเบเบเบตเปเบเบตเปเปเบญเบฑเบเบเบฅเบดเปเบเบเบฑเบเบเปเบญเบเบเบฒเบเปเบเบปเปเบฒเปเบเบดเบ
- เบเบตเปเบขเบนเปเบเบตเปเบเบนเปเปเบเปเบเบฐเบเบทเบเบเปเบฝเบเปเบชเบฑเปเบเบเบฒเบเบซเบผเบฑเบเบเบฒเบเบชเปเบฒเปเบฅเบฑเบเบเบฑเปเบเบเบญเบ
- เบงเบดเบเบตเบเบตเปเบเบงเบเปเบฎเบปเบฒเบเบฐเบเบฑเบเบเบธเบ token
- เบฅเบฐโเบซเบฑเบโเบเบงเบฒเบกโเบเบญเบโเปเบ
- เบฎเบนเบเปเบเบเบเบฒเบเบชเบปเปเบเบฅเบฐเบซเบฑเบเบขเบทเบเบขเบฑเบ
- เบซเบผเบฑเบโเบเบฒเบโเบเบฒเบโเบญเบฐโเบเบธโเบเบฒเบโเบชเปเบฒโเปเบฅเบฑเบโเปเบฅเปเบงโ, เบเบนเปโเปเบเปโเบเบฐโเปเบเปโเบฎเบฑเบโเบเบฒเบโเปเบญเบโเปเบโเบซเบฒโเบซเบเปเบฒโเบเบตเปโเบฅเบฐโเบเบธโเปเบงเปโเปเบโเบเปเบฒโเบฎเปเบญเบโเบชเบฐโเบซเบกเบฑเบโเบเปเบฒโเบญเบดเบโ, เบกเบตโเบเปเปโเบเบดเบโเบเบฒเบโเบซเบผเบทโเบฅเบฐโเบซเบฑเบโเบเบฒเบโเบญเบฐโเบเบธโเบเบฒเบโเบเปเบฒเบโเบเบฒโเบฅเบฒโเบกเบดโเปเบเบต GETโ.
- เปเบญเบฑเบเบเบฅเบดเปเบเบเบฑเบ (script) เบเบฐเบเปเบญเบเปเบเปเบฎเบฑเบเบเบฒเบฅเบฒเบกเบดเปเบเบตเปเบซเบผเบปเปเบฒเบเบตเปเปเบฅเบฐ, เบเปเบฒเปเบเปเบฎเบฑเบเบฅเบฐเบซเบฑเบ, เปเบซเปเปเบฎเบฑเบเบเบฒเบเบฎเปเบญเบเบเปเบเปเปเปเบเบเบตเปเปเบเบทเปเบญเปเบซเปเปเบเป tokens.
- เบเปเบฒเบเปเบฒเบฎเปเบญเบเบเปเบเบทเบเบเปเบญเบ, Google API เบเบฑเบเบเบทเบเบกเบฒ:
- เบเบฒเบเปเบเบปเปเบฒเปเบเบดเบ token เบเบตเปเบเบงเบเปเบฎเบปเบฒเบชเบฒเบกเบฒเบเปเบฎเบฑเบเบเบฒเบเบฎเปเบญเบเบเป
- เปเบฅเบเบฐเปเบงเบฅเบฒเบเบตเปเบเบทเบเบเปเบญเบเบเบญเบ token เบเบตเป
- เบเปเบญเบเปเบซเบผเบ token เบเบทเบเปเปเปเปเบเบทเปเบญเปเบซเบผเบ token เบเบทเบเปเปเป.
เบเปเบญเบเบญเบทเปเบ เปเบปเบ เบเปเบฒเบเบเปเบญเบเปเบเบเบตเป Google API console:
เปเบเบทเปเบญเปเบฎเบฑเบเปเบซเปเบกเบฑเบเบชเบฐเบเบงเบเบเบงเปเบฒเบเบตเปเบเบฐเบญเปเบฒเบ script algorithm, เบเปเบฒเบเบชเบฒเบกเบฒเบเบชเบฐเปเบเบเบเบฑเปเบเบเบญเบเบเปเบฒเบญเบดเบเปเบเบเบฑเบเบเบฑเบเปเบเบเบเปเบฒเบเบซเบฒเบเบเบตเปเบเบฐเบเบฑเบเบเบทเบเบเบฒเบเปเบเบปเปเบฒเปเบเบดเบเปเบฅเบฐเปเบซเบผเบเบซเบเปเบฒเบเปเบเบทเบ tokens เบชเปเบฒเบฅเบฑเบเบเปเบฒเบฎเปเบญเบเบชเบฐเบซเบกเบฑเบ:
$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
เบเบงเบเปเบฎเบปเบฒเบเปเบฒเบเบปเบ Client ID เปเบฅเบฐเบเบงเบฒเบกเบฅเบฑเบเบเบญเบเบฅเบนเบเบเปเบฒเบเบตเปเปเบเปเบฎเบฑเบเปเบเบเบธเบเบชเบปเบกเบเบฑเบเบเบปเบงเบฅเบฐเบเบธเบฅเบนเบเบเปเบฒ OAuth, เปเบฅเบฐเบเบปเบงเบเบงเบเบชเบญเบเบฅเบฐเบซเบฑเบเปเบกเปเบเบชเบฐเบเบฃเบดเบเบเบญเบ 43 เบซเบฒ 128 เบเบปเบงเบญเบฑเบเบชเบญเบเบเบตเปเบเปเบญเบเบเบทเบเบชเปเบฒเบเปเบเบเบชเบธเปเบกเบเบฒเบเบเบปเบงเบญเบฑเบเบชเบญเบเบเบตเปเบเปเปเปเบเปเบเบญเบ: [AZ] / [az] / [0-9] / "-" / "." / "_" / "~".
เบฅเบฐเบซเบฑเบเบเบตเปเบเบฐเบเบทเบเบชเบปเปเบเบเปเปเบญเบตเบเบเบฑเปเบ. เบกเบฑเบเบเปเบฒเบเบฑเบเบเปเบญเบเปเบซเบงเปเบเบตเปเบเบนเปเปเบเบกเบเบตเบชเบฒเบกเบฒเบเบเบฑเบเบเบงเบฒเบเบเบฒเบเบเบญเบเปเบเปเบเบทเบเปเบเบฑเบเบเบฒเบเบเปเบฝเบเปเบชเบฑเปเบเบเบฒเบเบซเบผเบฑเบเบเบฒเบเบเบฒเบเบญเบฐเบเบธเบเบฒเบเบเบญเบเบเบนเปเปเบเป.
เบเปเบฒเบเบชเบฒเบกเบฒเบเบชเบปเปเบเบเบปเบงเบเบงเบเบชเบญเบเบฅเบฐเบซเบฑเบเปเบเบเปเบฒเบฎเปเบญเบเบเปเปเบเบเบฐเบเบธเบเบฑเบเปเบเบฑเบเบเปเปเบเบงเบฒเบกเบเบตเปเบเบฑเบเปเบเบ (เปเบเบดเปเบเปเบฎเบฑเบเปเบซเปเบกเบฑเบเบเปเปเบกเบตเบเบงเบฒเบกเบซเบกเบฒเบ - เบเบตเปเปเบกเปเบเปเบซเบกเบฒเบฐเบชเบปเบกเบชเปเบฒเบฅเบฑเบเบฅเบฐเบเบปเบเบเบตเปเบเปเปเบชเบฐเบซเบเบฑเบเบชเบฐเบซเบเบนเบ SHA256), เบซเบผเบทเปเบเบเบเบฒเบเบชเปเบฒเบ hash เปเบเบเปเบเป SHA256 algorithm, เปเบเบดเปเบเบเปเบญเบเบเบทเบเปเบเบปเปเบฒเบฅเบฐเบซเบฑเบเปเบ BASE64Url (เปเบเบเบเปเบฒเบเบเบฑเบ. เบเบฒเบ Base64 เปเบเบเบชเบญเบเบเบปเบงเบญเบฑเบเบชเบญเบเบเบฒเบเบฐเบฅเบฒเบ) เปเบฅเบฐเปเบญเบปเบฒเบเบฒเบเบชเบดเปเบเบชเบธเบเปเบชเบฑเปเบเบเบปเบงเบญเบฑเบเบชเบญเบ: =.
เบเปเปเปเบ, เบเบงเบเปเบฎเบปเบฒเบเปเบฒเปเบเบฑเบเบเปเบญเบเปเบฅเบตเปเบกเบเบปเปเบเบเบฑเบ http เปเบเปเบเบทเปเบญเบเบเปเบญเบเบเบดเปเบเปเบเบทเปเบญเปเบเปเบฎเบฑเบเบเบฒเบเบเบญเบเบชเบฐเบซเบเบญเบเบซเบผเบฑเบเบเบฒเบเบเบฒเบเบญเบฐเบเบธเบเบฒเบ, เปเบเบดเปเบเบเบฐเบเบทเบเบชเบปเปเบเบเบทเบเปเบเบฑเบเบเบฒเบเบเปเบฝเบเปเบชเบฑเปเบเบเบฒเบ.
เบงเบฝเบเบเบฒเบเบเปเบฅเบดเบซเบฒเบเปเบกเปเบเบเปเบฒเปเบเบตเบเบขเบนเปเปเบเปเบเบทเปเบญเบเปเบกเปเบเปเบฒเบเบเบดเปเบชเบ, เบเบงเบเปเบฎเบปเบฒเบเปเปเบชเบฒเบกเบฒเบเบเบฐเบเบดเปเบชเบเบเบงเบฒเบกเปเบเบฑเบเปเบเปเบเปเบเบตเปเบเบนเปเบเปเบฅเบดเบซเบฒเบเบซเบผเบฒเบเบเบปเบเบเบฐเปเบฅเปเบเบชเบฐเบเบดเบเปเบเปเบงเบฅเบฒเบเบฝเบงเบเบฑเบ, เบเบฑเปเบเบเบฑเปเบเบกเบฑเบเบเบฐเปเบฅเบทเบญเบเบเบญเบเบชเปเบฒเบฅเบฑเบเบเบนเปเปเบเปเบเบฐเบเบธเบเบฑเบเปเบเบเบชเบธเปเบก, เปเบเปเบเปเบญเบเปเบเปเบเปเบฒเบเบปเบเบเบญเบเบเบตเปเบเปเบฒเบเบปเบเปเบงเปเบเปเบญเบเปเบเบฒเบฐเบงเปเบฒ เบเบงเบเปเบเบปเบฒเบเบฑเบเบเปเบญเบเบเบทเบเปเบเบตเปเบกเปเบเบฑเบเบเบตเปเปเบเบทเปเบญเบเบทเปเบเปเปเบ API console.
access_type=offline เปเบฒเบ เบเบงเบฒเบกเบงเปเบฒเปเบญเบฑเบเบเบฅเบดเปเบเบเบฑเบเบชเบฒเบกเบฒเบเบญเบฑเบเปเบเบ token เบเบตเปเปเบปเบเบญเบฒเบเบธเบเปเบงเบเบเบปเบงเบกเบฑเบเปเบญเบเปเบเบเบเปเปเบกเบตเบเบฒเบเปเบเปเบเบญเบเบเบฑเบเบเบนเปเปเบเปเบเบฑเบ browser,
response_type=เบฅเบฐเบซเบฑเบ เบเปเบฒเบเบปเบเบฎเบนเบเปเบเบเบเบญเบเบงเบดเบเบตเบเบตเปเบฅเบฐเบซเบฑเบเบเบฐเบเบทเบเบชเบปเปเบเบเบทเบ (เบเบฒเบเบญเปเบฒเบเบญเบตเบเปเบเบดเบเบงเบดเบเบตเบเบฒเบเบญเบฐเบเบธเบเบฒเบเปเบเบปเปเบฒ, เปเบกเบทเปเบญเบเบนเปเปเบเปเบเบฑเบเบฅเบญเบเบฅเบฐเบซเบฑเบเบเบฒเบเบเบปเบงเบเปเบญเบเปเบงเบฑเบเปเบเบปเปเบฒเปเบเปเบเบชเบฐเบเบดเบ),
เบเบญเบเปเบเบ เบเบตเปเบเบญเบเบเบญเบเปเบเบ เปเบฅเบฐเบเบฐเปเบเบเบเบญเบเบเบฒเบเปเบเบปเปเบฒเปเบเบดเบ. เบเบงเบเบกเบฑเบเบเปเบญเบเบเบทเบเปเบเบเบญเบญเบเบเปเบงเบเบเปเบญเบเบซเบงเปเบฒเบ เบซเบผเบท %20 (เบญเบตเบเบเบฒเบกเบเบฒเบเปเบเบปเปเบฒเบฅเบฐเบซเบฑเบ URL). เบเบฑเบเบเบตเบฅเบฒเบเบเบทเปเบเบญเบเบเบทเปเบเบเบตเปเปเบเบปเปเบฒเปเบเบดเบเบเบตเปเบกเบตเบเบฐเปเบเบเบชเบฒเบกเบฒเบเปเบเบดเปเบเปเบเปเบเบตเปเบเบตเป:
เบซเบผเบฑเบเบเบฒเบเปเบเปเบฎเบฑเบเบฅเบฐเบซเบฑเบเบเบฒเบเบญเบฐเบเบธเบเบฒเบ, เปเบญเบฑเบเบเบฅเบดเปเบเบเบฑเบเบเบฐเบชเบปเปเบเบเบทเบเบเปเปเบเบงเบฒเบกเบเบตเปเปเบเปเบเบดเบเบเบฑเบเบเบปเบงเบเปเบญเบเปเบงเบฑเบ, เบขเบธเบเบเบฑเบเบขเบนเปเปเบเบเบญเบเปเบฅเบฐเบชเบปเปเบเบเปเบฒเบฎเปเบญเบเบเป POST เปเบเบทเปเบญเปเบซเปเปเบเปเบฎเบฑเบ token. เบเบงเบเปเบฎเบปเบฒเบเบตเปเบเบญเบเบขเบนเปเปเบเบกเบฑเบ id เบเบตเปเบเปเบฒเบเบปเบเปเบงเปเบเปเบญเบเบซเบเปเบฒเบเบตเปเปเบฅเบฐเบเบงเบฒเบกเบฅเบฑเบเบเบฒเบ console API, เบเบตเปเบขเบนเปเบเบนเปเปเบเปเบเบฐเบเบทเบเปเบญเบเปเบฅเบฐ grant_type เบเบฒเบกเบเปเปเบเปเบฒเบเบปเบเบเบญเบเปเบเปเบเบเบญเบ.
เปเบเบเบฒเบเบเบญเบเบชเบฐเปเบญเบ, เบเบงเบเปเบฎเบปเบฒเบเบฐเปเบเปเบฎเบฑเบเปเบเปเบเบฑเบเบเบฒเบเปเบเบปเปเบฒเปเบเบดเบ, เปเบฅเบเบฐเปเบงเบฅเบฒเบเบงเบฒเบกเบเบทเบเบเปเบญเบเบเบญเบเบกเบฑเบเปเบเบฑเบเบงเบดเบเบฒเบเบต, เปเบฅเบฐเปเบเปเบเบฑเบเปเบซเบผเบเบเปเปเบกเบนเบเบเบทเบเปเปเป, เปเบเบดเปเบเบเบงเบเปเบฎเบปเบฒเบชเบฒเบกเบฒเบเบญเบฑเบเปเบเบเปเบเบทเปเบญเบเปเบฒเบเบเบฒเบเปเบเบปเปเบฒเปเบเบดเบเปเบเป.
เปเบญเบฑเบเบเบฅเบดเปเบเบเบฑเบเบเปเบญเบเปเบเบฑเบเบฎเบฑเบเบชเบฒ tokens เปเบเบชเบฐเบเบฒเบเบเบตเปเบเบตเปเบเบญเบเปเบเบเบตเปเบกเบตเบเบตเบงเบดเบเบเบฒเบเปเบเบฑเบเบฎเบฑเบเบชเบฒเบเบฒเบง, เบเบฑเปเบเบเบฑเปเบเบเบปเบเบเปเบงเบฒเบเบงเบเปเบฎเบปเบฒเบเบญเบเบเบฒเบเปเบเบปเปเบฒเปเบเบดเบเบเบตเปเปเบเปเบฎเบฑเบ, เปเบญเบฑเบเบเบฅเบดเปเบเบเบฑเบเบเบฐเบเปเปเบชเบปเปเบเบเบทเบ token เปเบซเบผเบเบซเบเปเบฒเบเปเบเบทเบ. เปเบเบเบตเปเบชเบธเบ, เบเปเบฒเบเบฐเปเบเบปเปเบฒเปเบเปเปเบเบตเปเบกเบเบฒเบเบฎเปเบญเบเบเปเปเบซเปเบเบญเบ token; เบเปเบฒเบเปเบฒเบฎเปเบญเบเบชเบฐเบซเบกเบฑเบเบเปเปเบชเปเบฒเปเบฅเบฑเบเปเบฅเบฐ refresh token เบเปเปเปเบเปเบเบทเบเบชเบปเปเบเบเบทเบ, เบกเบฑเบเบเบฐเปเบฅเบตเปเบกเบเบฑเปเบเบเบญเบเบญเบตเบเปเบเบทเปเบญเบซเบเบถเปเบ (เบเบงเบเปเบฎเบปเบฒเบเบทเบงเปเบฒเบกเบฑเบเบเปเปเบเบญเบเปเบเบเบตเปเบเบฐเปเบเบฑเบเบฎเบฑเบเบชเบฒ tokens เบขเบนเปเปเบเปเบเบทเปเบญเบ, เปเบฅเบฐเบเบงเบเปเบฎเบปเบฒเบเปเปเบเบญเบเปเบ. 'เบเปเปเบเปเบญเบเบเบฒเบเบเบตเปเบเบฐเบชเบฑเบเบชเบปเบเบเบฑเบ cryptography เบซเบผเบทเปเบเบตเบเบเบปเบงเบเปเบญเบเปเบงเบฑเบเปเบฅเบทเปเบญเบเป).
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
}
เบเบฑเปเบเบเบตเปเบเปเบฒเบเปเบเปเบชเบฑเบเปเบเบเปเบซเบฑเบเปเบฅเปเบง, เปเบกเบทเปเบญเบเบญเบ token, Invoke-WebRequest เบเบทเบเบเปเบฒเปเบเป. เบเปเปเปเบซเบกเบทเบญเบเบเบฑเบ Invoke-RestMethod, เบกเบฑเบเบเปเปเปเบเปเบชเบปเปเบเบเบทเบเบเปเปเบกเบนเบเบเบตเปเปเบเปเบฎเบฑเบเปเบเบฎเบนเบเปเบเบเบเบตเปเบชเบฒเบกเบฒเบเปเบเปเปเบเปเปเบฅเบฐเบชเบฐเปเบเบเบชเบฐเบเบฒเบเบฐเบเบญเบเบเปเบฒเบฎเปเบญเบเบเป.
เบเปเปเปเบ, script เบเปเปเบซเปเปเบเบปเปเบฒเปเบชเปเบเบทเปเปเบฅเบฐเบเบฒเบกเบชเบฐเบเบธเบเบเบญเบเบเบนเปเปเบเป, เบชเปเบฒเบเบเบฒเบเปเบเบปเปเบฒเบชเบนเปเบฅเบฐเบเบปเบ + เบญเบตเปเบกเบง.
เบเบฒเบเบฎเปเบญเบเบเป
เบเบฒเบเบฎเปเบญเบเบเปเบเปเปเปเบเบเบฐเปเบเบฑเบ - เบเปเบญเบเบญเบทเปเบ เปเบปเบ, เบเปเบฒเบเบเปเบฒเปเบเบฑเบเบเปเบญเบเบเบงเบเปเบเบดเปเบเบงเปเบฒเบเบนเปเปเบเปเบเบตเปเบกเบตเบเบฒเบเปเบเบปเปเบฒเบชเบนเปเบฅเบฐเบเบปเบเบเบฝเบงเบเบฑเบเบกเบตเบขเบนเปเบเปเบญเบเปเบฅเปเบงเปเบเบทเปเบญเปเบซเปเบกเบตเบเบฒเบเบเบฑเบเบชเบดเบเปเบเปเบเบเบฒเบเบชเปเบฒเบเปเบซเบกเปเบซเบผเบทเบเบฒเบเปเบเบตเบเปเบเปเปเบเบเบฐเบเบธเบเบฑเบ.
เบเปเบฒเบเบฐเปเบเบปเปเบฒเปเบเปเบเบฑเบเบชเบดเบเปเบเบเบฐเบเบดเบเบฑเบเบเบฒเบเบฎเปเบญเบเบเปเบเบฑเบเบซเบกเบปเบเปเบเบฎเบนเบเปเบเบเบเบญเบเบซเบเปเบฒเบเบตเปเบซเบเบถเปเบเบเบตเปเบกเบตเบเบฒเบเบเบฑเบเปเบฅเบทเบญเบ, เปเบเบเปเบเปเบเบธเปเบก:
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'])
}
}
}
}
เปเบเปเบเปเบฅเบฐเบเปเบฒเบฎเปเบญเบเบเป, เบเปเบฒเบเบเปเบฒเปเบเบฑเบเบเปเบญเบเบชเบปเปเบเบซเบปเบงเบเบฒเบเบญเบฐเบเบธเบเบฒเบเบเบตเปเบกเบตเบเบฐเปเบเบ token เปเบฅเบฐ Access token เบเบปเบงเบเบญเบเบกเบฑเบเปเบญเบ. เปเบเบเบฑเบเบเบธเบเบฑเบ, เบเบฐเปเบเบ token เปเบกเปเบเบชเบฐเปเบซเบกเบต Bearer. เปเบเบทเปเบญเบเบเบฒเบเบงเปเบฒ เบเบงเบเปเบฎเบปเบฒเบเปเบฒเปเบเบฑเบเบเปเบญเบเปเบเปเบเบงเบเปเบเบดเปเบเบงเปเบฒ token เบเปเปเบซเบกเบปเบเบญเบฒเบเบธเปเบฅเบฐเบเบฑเบเบเบธเบเบกเบฑเบเบซเบผเบฑเบเบเบฒเบเบซเบเบถเปเบเบเบปเปเบงเปเบกเบเบเบฒเบเปเบงเบฅเบฒเบเบตเปเบกเบฑเบเบเบทเบเบญเบญเบ, เบเปเบฒเบเบฐเปเบเบปเปเบฒเปเบเปเบฅเบฐเบเบธเบเปเบฒเบฎเปเบญเบเบเปเบชเปเบฒเบฅเบฑเบเบเบฑเบเบเบฑเบเบญเบทเปเบเบเบตเปเบชเบปเปเบเบเบทเบ token เบเบฒเบเปเบเบปเปเบฒเปเบเบดเบ. เบเบดเปเบเบชเปเบงเบเบเบฝเบงเบเบฑเบเบเบญเบเบฅเบฐเบซเบฑเบเปเบกเปเบเบขเบนเปเปเบเบเบญเบเบเบปเปเบเบเบญเบเบชเบฐเบเบฃเบดเบเปเบกเบทเปเบญเปเบเปเบฎเบฑเบ token เบเปเบฒเบญเบดเบ Access:
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 เบเบญเบเบซเบฒเบเบนเปเปเบเปเบเบตเปเบกเบตเบญเบตเปเบกเบงเบเบฑเปเบเปเบเปเป, เบฅเบงเบกเบเบฑเบเบเบฒเบกเปเบเบ. เบเปเบฒเบเบเบฑเบเบชเบฒเบกเบฒเบเปเบเป wildcard: =, :, :{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
}
เบซเบเปเบฒเบเบตเปเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบฑเบเบเบธเบเปเบฅเบฐเบชเปเบฒเบเบเบฑเบเบเบตเบกเบต syntax เบเบตเปเบเปเบฒเบเบเบทเบเบฑเบ; เบเปเปเปเบกเปเบเบเบฒเบเปเบเบตเปเบกเปเบเบตเบกเบเบฑเบเบซเบกเบปเบเปเบกเปเบเบเปเบญเบเบเบฒเบ; เปเบเบชเปเบงเบเบเบตเปเบกเบตเปเบเบตเปเบเบฅเบฐเบชเบฑเบ, เบเปเบฒเบเบเปเบฒเปเบเบฑเบเบเปเบญเบเบฅเบฐเบเบธ array เบเบตเปเบชเบฒเบกเบฒเบเบเบฑเบเบเบธเปเบเปเปเบเบดเบเบซเบเบถเปเบเบเบฑเบเบเบถเบเบเบตเปเบกเบตเบเปเบฒเบเบงเบเปเบฅเบฐเบเบฐเปเบเบเบเบญเบเบกเบฑเบ.
เปเบเบทเปเบญเบเปเปเปเบซเปเบกเบตเบเปเปเบเบดเบเบเบฒเบเปเบเปเบงเบฅเบฒเบเบตเปเปเบเบตเปเบกเบเบนเปเปเบเปเปเบเบปเปเบฒเปเบเบเบธเปเบก, เบเปเบฒเบญเบดเบเบเบงเบเปเบฎเบปเบฒเบชเบฒเบกเบฒเบเบเบงเบเปเบเบดเปเบเบงเปเบฒเบฅเบฒเบงเปเบเบฑเบเบชเบฐเบกเบฒเบเบดเบเบเบญเบเบเบธเปเบกเบเบตเปเปเบฅเปเบงเปเบเบเบเบฒเบเปเบเปเบฎเบฑเบเบเบฑเบเบเบตเบฅเบฒเบเบเบทเปเบเบญเบเบชเบฐเบกเบฒเบเบดเบเบเบธเปเบกเบซเบผเบทเบญเบปเบเบเบฐเบเบญเบเบเบฒเบเบเบนเปเปเบเปเปเบญเบ.
เบเบฒเบเบชเบญเบเบเบฒเบกเบเบฒเบเปเบเบฑเบเบชเบฐเบกเบฒเบเบดเบเบเบธเปเบกเบเบญเบเบเบนเปเปเบเปเบชเบฐเปเบเบฒเบฐเปเบเปเบถเปเบเบเบฐเบเปเปเปเบเบฑเบเบเบฒเบเปเบญเบตเปเบเบเบทเบ เปเบฅเบฐเบเบฐเบชเบฐเปเบเบเบเบฒเบเปเบเบฑเบเบชเบฐเบกเบฒเบเบดเบเปเบเบเบเบปเบเปเบเบปเปเบฒเบเบฑเปเบ. เบฅเบงเบกเบเบฑเบเบเบนเปเปเบเปเบขเบนเปเปเบเบเบธเปเบกเบเปเปเปเบกเปเบเบตเปเบกเบตเบเบธเปเบกเปเบเบฑเบเบเปเบญเบเบขเบนเปเปเบฅเปเบงเบเบตเปเบเบนเปเปเบเปเปเบเบฑเบเบชเบฐเบกเบฒเบเบดเบเบเบฐเบเบฐเบชเบปเบเบเบปเบเบชเปเบฒเปเบฅเบฑเบ.
เบชเบฐเบซเบฅเบธเบ
เบเบฑเบเบซเบกเบปเบเบเบตเปเบเบฑเบเปเบซเบผเบทเบญเปเบกเปเบเปเบเบทเปเบญเบชเบปเปเบเบเบนเปเปเบเปเบฅเบฐเบซเบฑเบเบเปเบฒเบเบชเปเบฒเบฅเบฑเบเบเบฑเบเบเบตเปเบซเบกเป. เบเบงเบเปเบฎเบปเบฒเปเบฎเบฑเบเบชเบดเปเบเบเบตเปเบเปเบฒเบ SMS, เปเบฅเบฐเบชเบปเปเบเบเปเปเบกเบนเบเบเบปเปเบงเปเบเบเปเบงเบเบเปเบฒเปเบเบฐเบเปเบฒเปเบฅเบฐเปเบเบปเปเบฒเบชเบนเปเบฅเบฐเบเบปเบเบญเบตเปเบกเบงเบชเปเบงเบเบเบปเบง, เปเบเบดเปเบ, เบเปเบญเบกเบเบฑเบเปเบเบตเปเบเบฅเบฐเบชเบฑเบ, เปเบเปเบเบทเบเบชเบฐเบซเบเบญเบเปเบซเปเปเบเบเบเบฐเปเบเบเบเบฒเบเบเปเบฒเบเบเบฒเบ. เปเบเบฑเบเบเบฒเบเปเบฅเบทเบญเบ, เบเปเบฒเบเบชเบฒเบกเบฒเบเบเบฐเบซเบเบฑเบเปเบเบดเบเปเบฅเบฐเบชเบปเปเบเบฅเบฐเบซเบฑเบเบเปเบฒเบเบเบญเบเบเปเบฒเบเปเบเบซเบฒเบเบฒเบเบชเบปเบเบเบฐเบเบฒ telegram เบฅเบฑเบ, เปเบเบดเปเบเบเบฑเบเบชเบฒเบกเบฒเบเบเบดเบเบฒเบฅเบฐเบเบฒเบเบฑเบเปเบเบเบตเบชเบญเบ (MacBooks เบเบฐเปเบเบฑเบเบเปเปเบเบปเบเปเบงเบฑเปเบ).
เบเบญเบเปเบเบเบตเปเบญเปเบฒเบเบเบปเบเบเบปเบ. เบเปเบญเบเบเบฐเบเบตเปเบเบเบตเปเบเบฐเปเบซเบฑเบเบเปเบฒเปเบเบฐเบเปเบฒเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบฑเบเบเบธเบเบฎเบนเบเปเบเบเบเบฒเบเบเบฝเบเบเบปเบเบเบงเบฒเบกเปเบฅเบฐเบเปเบญเบเบเบฒเบเปเบซเปเบเปเบฒเบเบเบฑเบเบเบงเบฒเบกเบเบดเบเบเบฒเบเบซเบเปเบญเบเบฅเบปเบเปเบเปเบงเบฅเบฒเบเบฝเบ scripts =)
เบเบฑเบเบเบตเบฅเบฒเบเบเบทเปเบเบญเบเบเบฒเบเปเบเบทเปเบญเบกเบเปเปเบเบตเปเบญเบฒเบเบเบฐเปเบเบฑเบเบเบฐเปเบซเบเบเบเบฒเบเบเบดเบเบชเบฐเบเบตเบซเบผเบทเบเบฝเบเปเบเปเบเบญเบเบเปเบฒเบเบฒเบก:
OAuth 2.0 เบชเปเบฒเบฅเบฑเบเปเบญเบฑเบเบฏเบกเบทเบเบท เปเบฅเบฐ Desktop เบเบฒเบเบเปเบฒเปเบเป OAuth 2.0 เบชเปเบฒเบฅเบฑเบเบเปเบฒเบฎเปเบญเบเบชเบฐเบซเบกเบฑเบเปเบเบตเบเปเบงเบตเปเบงเบฑเบ เบฅเบฐเบซเบฑเบเบซเบผเบฑเบเบเบฒเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเปเบฅเบเบเปเบฝเบเบฅเบฐเบซเบฑเบเปเบเบเบฅเบนเบเบเปเบฒเบชเบฒเบเบฒเบฅเบฐเบเบฐ OAuth เบชเปเบฒเบเบเบปเบงเบญเบฑเบเบชเบญเบเปเบเบเบชเบธเปเบกเบเปเบงเบ PowerShell เบเบฒเบเบฐเบฅเบฒเบ ASCII เปเบฅเบฐเบฅเบฒเบเบฅเบฐเบญเบฝเบ PowerShell: เปเบเปเบฎเบฑเบเบเปเบฒ hash เบชเปเบฒเบฅเบฑเบเบชเบฐเบเบฃเบดเบ เปเบเบปเปเบฒเบฅเบฐเบซเบฑเบ/เบเบญเบเบฅเบฐเบซเบฑเบ Base64Url เบเบฒเบเปเบเบปเปเบฒเบฅเบฐเบซเบฑเบ Base64 เบเบฝเบเบเบฑเบเบเบฒเบเปเบเบปเปเบฒเบฅเบฐเบซเบฑเบ Base64url Invoke-RestMethod เปเบ PowerShell 5.1 เบเปเปเปเบเปเบฎเบฑเบเบเบฒเบเปเบซเบผเบ token เบเบทเบเปเปเป เปเบเบดเบเปเบกเปเบเบงเปเบฒ access_type เบเบฐเบญเบญเบเบฅเบฒเบเบขเบนเปเปเบเบเบฑเปเบเบเบญเบเบเบต 1 เบเปเบฝเบงเบเบฑเบเบเบนเปเบเบฐเบเบดเบเบฑเบเบเบฒเบเบเบฝเบเบเบฝเบ Directory API: เบเบฑเบเบเบตเบเบนเปเปเบเป เบเบปเปเบเบซเบฒเบเบนเปเปเบเป Directory API: เบเบธเปเบก เบเบฒเบเบเบฑเบเบเบฒเบเบเบงเบฒเบกเบเบดเบเบเบฒเบเบชเปเบฒเบฅเบฑเบ Invoke-RestMethod - Powershell
เปเบซเบผเปเบเบเปเปเบกเบนเบ: www.habr.com