Skip to content

Instantly share code, notes, and snippets.

@apinstein
Last active September 18, 2023 19:03
Show Gist options
  • Save apinstein/78c3e66a077fdd1458d5e08964f45f96 to your computer and use it in GitHub Desktop.
Save apinstein/78c3e66a077fdd1458d5e08964f45f96 to your computer and use it in GitHub Desktop.
Google Apps Script to enumerate all email addresses active on a domain
/***
* 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