Last active
September 18, 2023 19:03
-
-
Save apinstein/78c3e66a077fdd1458d5e08964f45f96 to your computer and use it in GitHub Desktop.
Google Apps Script to enumerate all email addresses active on a domain
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*** | |
* INSTRUCTIONS | |
* 1. Change the domain in the CONFIG below to your domain. | |
* 2. Logged in as a Google Workspace admin for the domain of interest, create a new Google Sheet in the Workspace. | |
* 3. In the sheet, select the menu Extentions > Apps Scripts | |
* 4. In the script editor, add a Service (with the + in "Services") and add the "AdminDirectory" API. | |
* 5. Copy/paste this code into the CODE section | |
* 6. Save & Run the code | |
* 7. The sheet should be updated with a full inventory of your domain's email address surface area! | |
*/ | |
// CONFIG | |
const domain = 'showcaseidx.com'; // Replace with your GSuite domain | |
// Clear the sheet and set headers | |
let sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); | |
sheet.clear(); | |
sheet.appendRow(['account type', 'account name', 'email address', 'is alias?', 'DL members']); | |
listAllUserAliases() | |
listAllGroupAliases() | |
function listAllUserAliases() { | |
var users = AdminDirectory.Users.list({domain: domain, viewType: 'admin_view'}).users; | |
if (users) { | |
for (var i = 0; i < users.length; i++) { | |
var user = users[i]; | |
console.log(`[${user.primaryEmail}] Found user...`) | |
if (user.suspended) { | |
console.log(`[${user.primaryEmail}] User suspended, skipping...`) | |
continue | |
} | |
// Append the primary email of the user | |
sheet.appendRow(['user', user.primaryEmail, user.primaryEmail, false]); | |
// Check if aliases are available for the user | |
if (user.aliases && user.aliases.length > 0) { | |
console.log(`[${user.primaryEmail}] Found ${user.aliases.length} aliases.`) | |
for (var j = 0; j < user.aliases.length; j++) { | |
sheet.appendRow(['user', user.primaryEmail, user.aliases[j], true]); | |
} | |
} else { | |
console.log(`[${user.primaryEmail}] Found 0 aliases.`) | |
} | |
} | |
} | |
} | |
function getActiveGroupMembers(groupEmail) | |
{ | |
var rows = []; | |
var pageToken, page; | |
do { | |
page = AdminDirectory.Members.list(groupEmail, | |
{ | |
domainName: domain, | |
maxResults: 500, | |
pageToken: pageToken, | |
}); | |
var members = page.members | |
if (members) | |
{ | |
for (var i = 0; i < members.length; i++) | |
{ | |
var member = members[i]; | |
rows.push(member); | |
} | |
} | |
pageToken = page.nextPageToken; | |
} while (pageToken); | |
return rows; | |
} | |
function listAllGroupAliases() { | |
var groups = AdminDirectory.Groups.list({domain: domain}).groups; | |
if (groups) { | |
for (var i = 0; i < groups.length; i++) { | |
var group = groups[i]; | |
console.log(`[${group.email}] Found group...`) | |
// gather group membership list | |
const groupMembers = getActiveGroupMembers(group.email); | |
const groupMemberEmails = groupMembers.reduce( (carry, currentVal) => { | |
carry.push(currentVal.email); | |
return carry; | |
}, []) | |
// Add primary group to sheet | |
sheet.appendRow(['group', group.email, group.email, false, groupMemberEmails.join(',')]); | |
// Check if aliases are available for the group | |
if (group.aliases && group.aliases.length > 0) { | |
console.log(`[${group.email}] Found ${group.aliases.length} aliases.`) | |
for (var j = 0; j < group.aliases.length; j++) { | |
sheet.appendRow(['group', group.email, group.aliases[j], true]); | |
} | |
} else { | |
console.log(`[${group.email}] Found 0 alises.`) | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment