Latest updates
Added options onerowpertarget
and suppressnoaliasrows
to gam print aliases
.
By default, the CSV output has three columns: Alias,Target,TargetType
; if a target
has multiple aliases, there will be multiple rows, one per alias. Specifying onerowpertarget
changes
the three columns to: Target,TargetType,Aliases
; all aliases for the target are space-separated in the
Aliases
column.
Specifying both onerowpertarget
and suppressnoaliasrows
causes GAM to not display any targets that have no aliases.
Added command gam remove aliases|nicknames <EmailAddress> user|group <EmailAddressEntity>
to more efficiently
delete the aliases in <EmailAddressEntity>
from the user|group
<EmailAddress>
.
You can combine these two changes as follows:
gam redirect csv ./OldDomainAliases.csv print aliases aliasmatchpattern ".*@olddomain.com" onerowpertarget suppressnoaliasrows
gam csv ./OldDomainAliases.csv gam remove aliases "~Target" "~TargetType" "~Aliases"
Fixed bug in gam user user@domain.com sendemail ... ghtml ...
that caused an inappropriate error.
ERROR: User: user@domain.com, Drive File: Email Doc, Data Not Retrieved: Invalid mimeType application/vnd.google-apps.document, must be text/html
Updated Google API libraries.
Reverted update 6.08.26 as it couldn't accurately distinguish between the following cases in all instances:
- A Service Account scope is not authorized
- A user with a service disabled
- A user from outside your domain
Improved the error message displayed when a Service Account scope is not authorized so it
can be distinguished from a user with the service disabled.
Updated gam create|use project
to handle the following spurious Google error:
ERROR: 500: Failed to convert server response to JSON - 500
Fixed bug in gam <UserTypeEntity> print|show contacts fields ...
that caused an error
when retrieving other contacts.
Revert Google Auth library to version 2.0.2 to avoid the following error:
ERROR: Token used too early, 1634572527 < 1634572532. Check that your computer's clock is set correctly.
Updated code to format Google timestamps with fractional seconds, e.g., 2021-10-13T13:35:42.590124Z
and timezone = utc
in gam.cfg.
Fixed bug in gam create|clear|dedup|delete|info|print|show|update contacts
where
the command would fail if the domain was not defined in gam.cfg
Fixed bug gam <UserTypeEntity> print contactdelegates
that caused a trap.
Updated gam print|show ownership
to display the event name of the most recent
primary event. If the event name is delete
, then you'll know who the owner was
but won't be able to do much with the file.
Fixed bug in gam update group
where field memberKey
was mistakenly converted to preferredMemberKey
;
this caused a trap.
Updated code to work around issue in Cloud Identity Groups API where a group member of
type CUSTOMER
is not properly marked as that type; this caused a trap.
Fixed bug in gam show cigroup-members
where the deprecated field memberKey
was still being used;
it was replaced with preferredMemberKey
.
Fixed bug in metacommand multiprocessexit
where GAM would not terminate when the condition was met
by one process while multiple other processes termintated simultaneously with the condition not met.
In 6.07.24, delivery_settings
was added to the default list of fields in gam print group-members
.
Unfortunately, it is still the case that an additional API call per member is required to get this setting;
this makes getting group members very slow for large groups.
delivery_settings
has been removed from the default list of fields and the option showdeliverysettings
adds this field to the default list of fields. You can always specify a specific list of fields that includes
delivery_settings
.
Fixed bug in gam redirect csv ... multiprocess ...
that caused a trap when running on Windows.
Fixed bugs in gam <UserTypeEntity> copy othercontacts
that rendered it unusable; sigh.
Following Jay's lead, added support for newly announced group member restrictions.
You can update groups to restrict membership to only include users, groups or service accounts as well as internal users and groups.
- See: https://workspaceupdates.googleblog.com/2021/10/membership-restrictions-google-groups-.html
In the API, these member restrictions fall with a category calledSecuritySettings
.
Added option nosecuritysettings
to gam info cigroups <GroupEntity>
. By default, GAM
makes an additional API call to get the SecuritySettings
; this option suppresses that call.
Added option memberrestrictions <QueryMemberRestrictions>
to gam update cigroups <GroupEntity>
to define member restrictions.
- See: https://cloud.google.com/identity/docs/reference/rest/v1beta1/SecuritySettings#MemberRestriction
Added option memberrestrictions
to gam print cigroups
that causes GAM to make an
additional API call to get the member restrictions from the SecuritySettings
.
Added (json [charset <Charset>] <JSONData>)|(json file <FileName> [charset <Charset>])
to <PrinterAttribute>
that allows specification of printer attributes from JSON data in gam create|update printer
.
<PrinterAttribute> ::=
(description <String>)|
(displayname <String>)|
(json [charset <Charset>] <JSONData>)|(json file <FileName> [charset <Charset>])|
(makeandmodel <String>)|
(ou|org|orgunit <OrgUnitItem>)|
(uri <String>)|
(driverless [<Boolean>])
Added option copysheetprotectedranges [<Boolean>]
to gam <UserTypeEntity> copy drivefile
that causes
GAM to copy the Google Sheet permissions and protected ranges from the source file to the target file.
Updated gam update cigroups <GroupEntity> update [<GroupRole>] expires <Time> <UserTypeEntity>
to handle the following error:
ERROR: 403: permissionDenied - Error(3005): Non-premium customers do not have access to certain premium features.
Fixed bug in gam <UserTypeEntity> clear contacts
that caused a trap.
Changed license SKU Google-Apps
name Google Workspace Free/Standard
to G Suite Legacy
to be
consistent with Google.
Updated all commands that reference Cloud Identity Group members to use the field preferredMemberKey
rather than the deprecated field memberKey
which would cause traps.
Fixed bug in gam <UserTypeEntity> create|update contact json <JSONData>
that failed to delete
the read-only field updateTime
which caused the command to fail.
Added the following keyword to gam.cfg
that causes GAM to add a timestamp column
to the CSV output file; the value in each row is time at which the command started.
csv_output_timestamp_column
Name of column in the CSV output file to contain a timestamp
Default: ''
Added option timestampcolumn
to <Redirect>
that causes GAM to add a timestamp column labeled <String>
to the output CSV file; the value in each row is time at which the command started.
This overrides the csv_output_timestamp_column
value in gam.cfg
.
<Redirect> ::=
redirect csv <FileName> [multiprocess] [append] [noheader] [charset <Charset>]
[columndelimiter <Character>] [quotechar <Character>]
[timestampcolumn <String>]
[todrive <ToDriveAttribute>*] |
Added formatjson
to gam info|show resoldsubscriptions
and formatjson [quotechar <Character>]
to gam print resoldsubscriptions
.
Handle the following error as retryable when managing user's contacts:
ERROR: API access Denied
Added option addcsvdata <FieldName> <String>
to gam create drivefile ... csv
. This adds
additional columns of data to the CSV file output. For example, you are building student folders
on a Shared Drive as an admin and want to add ACLs to the folders allowing the student write access
and you want a shortcut on the student's My Drive pointing to the folder. By adding the student's
primary email address to the CSV output, it can be used in subsequent commands.
Students.csv
primaryEmail,Name
bob@domain.com,Bob Jones
mary@domain.com, Mary Smith
...
# Create the student folders on the Shared Drive
gam redirect csv ./StudentFolders.csv multiprocess csv Students.csv gam user admin@domain.com create drivefile mimetype gfolder drivefilena\
me "~~Name~~ Digital Portfolio" parentid <TeamDriveID> csv addcsvdata primaryEmail "~primaryEmail"
# Add ACLs granting the students write access to their folders; ~User refers to admin@domain.com
gam csv StudentFolders.csv gam user "~User" add drivefileacl "~id" user "~primaryEmail" role writer
# Add a shortcut to the folder on the student's My Drive
gam csv StudentFolders.csv gam user "~primaryEmail" create drivefileshortcut "~id" parentid root
Handle the following error in gam move drivefile
:
ERROR: 400: crossDomainMoveRestriction - Bad Request. User message: "crossDomainMoveRestriction"
Improved error messages when an unknown contact ID is used in a command.
Use Python library pathvalidate to clean up filenames in gam get drivefile|document
.
If you are using the source verson of GAMADV-XTD3, do the following command to update your Python libraries.
pip install --upgrade -r src/requirements.txt
Updated gam sync devices
to include the assetTag
field, if specified, as part of the device
comparison key in addition to serialNmmber
and deviceType
.
Fixed bug in gam create device
that caused a trap.
Updated gam print|show chromeapps|chromedevices|chromeversions
to handle the following error.
ERROR: 503: serviceNotAvailable - The service is currently unavailable.
GAM now uses the People API to manage user contacts rather than the Contacts API.
Most commands will work unchanged but Google has completely changed how the data is presented. If you
have scripts that process the output from print contacts
for example, they will have to be changed.
You might want to keep an older version of GAM available so you can compare the output from the two
versions and make adjustments as necessary.
This is work in progress, report issues/problems.
Installation
If you are a first time Gam user:
If you are upgrading from standard Gam
If you are upgrading from GAMADV-X or GAMADV-XTD