mirror of
https://github.com/GAM-team/GAM.git
synced 2026-06-08 16:21:38 +00:00
Compare commits
109 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
677f683377 | ||
|
|
85e90ec56c | ||
|
|
53c9544456 | ||
|
|
be8ae5957b | ||
|
|
0d4e56822e | ||
|
|
865fe4ea60 | ||
|
|
c77d0806c9 | ||
|
|
d5deb0192b | ||
|
|
a7df79b75e | ||
|
|
25d88d825a | ||
|
|
5e309fbae9 | ||
|
|
a549dc4aa6 | ||
|
|
b61f2f0566 | ||
|
|
eb852b5935 | ||
|
|
1628a42569 | ||
|
|
df75bb9623 | ||
|
|
31d20985b7 | ||
|
|
c2ca6c0180 | ||
|
|
86ba64c65e | ||
|
|
d730e96c15 | ||
|
|
9d9f0e5595 | ||
|
|
97d5ede378 | ||
|
|
35ecb1d0d8 | ||
|
|
0dea4c3026 | ||
|
|
c477dbf67e | ||
|
|
185386e5e7 | ||
|
|
07b3e89809 | ||
|
|
3c09743f34 | ||
|
|
1dab9633aa | ||
|
|
57222b1a77 | ||
|
|
b54fef185c | ||
|
|
c36a71fe9e | ||
|
|
3491bd2286 | ||
|
|
36bc8837a7 | ||
|
|
395e01c1c9 | ||
|
|
b6528c4bf5 | ||
|
|
d361825165 | ||
|
|
17bc6c9f44 | ||
|
|
4058399672 | ||
|
|
e9c11f8b8d | ||
|
|
a08865b0cd | ||
|
|
8782865da4 | ||
|
|
8d79fdfe24 | ||
|
|
d86be2014c | ||
|
|
700bdfe8f8 | ||
|
|
0c50f4a794 | ||
|
|
5cf154d70b | ||
|
|
a13101ca8a | ||
|
|
1c8a3a3c57 | ||
|
|
4fc4a21909 | ||
|
|
061fead29e | ||
|
|
36887ba658 | ||
|
|
cecd9dc7ae | ||
|
|
4a952cbd16 | ||
|
|
624ed5f57c | ||
|
|
0925ff8bd4 | ||
|
|
2aecfc24dc | ||
|
|
d5d17676cc | ||
|
|
aa62ac4f3c | ||
|
|
e555e5440d | ||
|
|
122f5c3c0d | ||
|
|
4423a1ed0b | ||
|
|
e0f8789a8a | ||
|
|
944e2ed5f4 | ||
|
|
0e7c3bee6a | ||
|
|
86e827ee66 | ||
|
|
3491267f9d | ||
|
|
4b97accc21 | ||
|
|
44daf499b1 | ||
|
|
d5ac0b6b8a | ||
|
|
ce1697baff | ||
|
|
10350fbe2e | ||
|
|
dccc0443de | ||
|
|
4bf9741748 | ||
|
|
05cd06062e | ||
|
|
a56dab310a | ||
|
|
6b31831be8 | ||
|
|
0890ed1c9b | ||
|
|
8897a2dfb3 | ||
|
|
459dd59a03 | ||
|
|
5fe53106ba | ||
|
|
3f4a517ebe | ||
|
|
6185431a7d | ||
|
|
f6db0f8c7f | ||
|
|
4cb9e89197 | ||
|
|
55a0d699f8 | ||
|
|
64c3254d4c | ||
|
|
aa3649328c | ||
|
|
ab9c3e0e2c | ||
|
|
43b26c28a3 | ||
|
|
844e6442ac | ||
|
|
a5ff890a15 | ||
|
|
48d1b29010 | ||
|
|
28b3741133 | ||
|
|
d0b07febb1 | ||
|
|
f20520b3a7 | ||
|
|
c59398791b | ||
|
|
9349bc413d | ||
|
|
b2dd233dbf | ||
|
|
4142e5c293 | ||
|
|
56acae7c7d | ||
|
|
376c911e58 | ||
|
|
33a9e7e1fa | ||
|
|
360485b3aa | ||
|
|
59e425e41c | ||
|
|
e5f52289d2 | ||
|
|
19aab2b2ad | ||
|
|
6d07329e21 | ||
|
|
2ac6e361f0 |
2
.github/ISSUE_TEMPLATE/za-bug-report.md
vendored
2
.github/ISSUE_TEMPLATE/za-bug-report.md
vendored
@@ -11,7 +11,7 @@ The issue tracker is for reporting product deficiencies. "How do I?" questions s
|
||||
|
||||
Please confirm the following:
|
||||
* I have upgraded to the latest GAM release from https://github.com/GAM-team/GAM/releases and I still have this issue.
|
||||
* I am typing the command as described in the GAM Wiki at https://github.com/jay0lee/gam/wiki
|
||||
* I am typing the command as described in the GAM Wiki at https://github.com/GAM-team/GAM/wiki.
|
||||
|
||||
Full steps to reproduce the issue:
|
||||
1.
|
||||
|
||||
18
.github/workflows/build.yml
vendored
18
.github/workflows/build.yml
vendored
@@ -71,11 +71,6 @@ jobs:
|
||||
goal: build
|
||||
staticx: yes
|
||||
name: Build Arm StaticX Legacy
|
||||
- os: macos-13
|
||||
jid: 7
|
||||
freethreaded: false
|
||||
goal: build
|
||||
name: Build Intel MacOS
|
||||
- os: macos-14
|
||||
jid: 8
|
||||
freethreaded: false
|
||||
@@ -158,7 +153,7 @@ jobs:
|
||||
with:
|
||||
path: |
|
||||
cache.tar.xz
|
||||
key: gam-${{ matrix.jid }}-20251031
|
||||
key: gam-${{ matrix.jid }}-20251218
|
||||
|
||||
- name: Untar Cache archive
|
||||
if: matrix.goal == 'build' && steps.cache-python-ssl.outputs.cache-hit == 'true'
|
||||
@@ -488,7 +483,7 @@ jobs:
|
||||
if [[ "$RUNNER_OS" == "Windows" ]]; then
|
||||
# pyscard seems to build outside venv but not in it.
|
||||
# build it so it's cached.
|
||||
"$PYTHON" -m pip install --upgrade pyscard
|
||||
"$PYTHON" -m pip install --upgrade --force-reinstall pyscard
|
||||
export PYTHON="${GITHUB_WORKSPACE}/venv/scripts/python.exe"
|
||||
else
|
||||
export PYTHON="${GITHUB_WORKSPACE}/venv/bin/python3"
|
||||
@@ -674,8 +669,10 @@ jobs:
|
||||
if: runner.os == 'Windows'
|
||||
shell: pwsh
|
||||
run: |
|
||||
$url = "https://files.certum.eu/software/SimplySignDesktop/Windows/9.3.2.67/SimplySignDesktop-9.3.2.67-64-bit-en.msi"
|
||||
$file = "SimplySignDesktop-9.3.2.67-64-bit-en.msi"
|
||||
#$url = "https://files.certum.eu/software/SimplySignDesktop/Windows/9.3.2.67/SimplySignDesktop-9.3.2.67-64-bit-en.msi"
|
||||
#$file = "SimplySignDesktop-9.3.2.67-64-bit-en.msi"
|
||||
$url = "https://files.certum.eu/software/SimplySignDesktop/Windows/9.3.4.72/SimplySignDesktop-9.3.4.72-64-bit-en.msi"
|
||||
$file = "SimplySignDesktop-9.3.4.72-64-bit-en.msi"
|
||||
Invoke-WebRequest $url -OutFile $file
|
||||
$log = "install.log"
|
||||
$procMain = Start-Process "msiexec" "/i `"$file`" /qn /l*! `"$log`"" -NoNewWindow -PassThru
|
||||
@@ -796,7 +793,8 @@ jobs:
|
||||
|
||||
- name: Archive production artifacts
|
||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # 4.6.2
|
||||
if: (github.event_name == 'push' || github.event_name == 'schedule' || github.event_name == 'workflow_dispatch') && matrix.goal != 'test'
|
||||
#if: (github.event_name == 'push' || github.event_name == 'schedule' || github.event_name == 'workflow_dispatch') && matrix.goal != 'test'
|
||||
if: always()
|
||||
with:
|
||||
name: gam-binaries-${{ env.GAMOS }}-${{ env.arch }}-${{ matrix.jid }}
|
||||
path: |
|
||||
|
||||
@@ -1737,13 +1737,16 @@ gam calendar <CalendarEntity> printacl [todrive <ToDriveAttribute>*]
|
||||
<AttendeeStatus> ::= accepted|declined|needsaction|tentative
|
||||
|
||||
<EventAttribute> ::=
|
||||
(allday <Date>)|
|
||||
(anyonecanaddself [<Boolean>])|
|
||||
(attachment <String> <URL>)|
|
||||
(attendee <EmailAddress>)|
|
||||
(attendeestatus [<AttendeeAttendance>] [<AttendeeStatus>] <EmailAddress>)|
|
||||
available|
|
||||
(birthday <Date>)|
|
||||
(color <EventColorName>)|
|
||||
(colorindex|colorid <EventColorIndex>)|
|
||||
(conferencedata meet <MeetID>)|
|
||||
(description <String>)|
|
||||
(end|endtime (allday <Date>)|<Time>)|
|
||||
(guestscaninviteothers <Boolean>)|
|
||||
@@ -1751,7 +1754,7 @@ gam calendar <CalendarEntity> printacl [todrive <ToDriveAttribute>*]
|
||||
(guestscanmodify <Boolean>)|
|
||||
(guestscanseeotherguests <Boolean>)|
|
||||
guestscantseeotherguests|
|
||||
hangoutsmeet|
|
||||
googlemeet|hangoutsmeet|
|
||||
<JSONData>|
|
||||
(jsonattendees [charset <Charset>] <String>)|
|
||||
(jsonattendees file <FileName> [charset <Charset>])|
|
||||
@@ -1762,7 +1765,7 @@ gam calendar <CalendarEntity> printacl [todrive <ToDriveAttribute>*]
|
||||
(privateproperty <PropertyKey> <PropertyValue>)|
|
||||
(range <Date> <Date>)|
|
||||
(recurrence <RRULE, EXRULE, RDATE and EXDATE line>)|
|
||||
(reminder <Number> email|popup))|
|
||||
(reminder <Number> email|popup)|
|
||||
(resource <ResourceID>)|
|
||||
(selectattendees [<AttendeeAttendance>] [<AttendeeStatus>] <UserTypeEntity>)|
|
||||
(sequence <Integer>)|
|
||||
@@ -1792,7 +1795,7 @@ The following attributes are equivalent:
|
||||
<EventAttribute>|
|
||||
clearattachments|
|
||||
clearattendees|
|
||||
clearhangoutsmeet|
|
||||
cleargooglemeet|clearhangoutsmeet|
|
||||
(clearprivateproperty <PropertyKey>)|
|
||||
clearresources|
|
||||
(clearsharedproperty <PropertyKey>)|
|
||||
@@ -1911,7 +1914,7 @@ gam calendar|calendars <CalendarEntity> empty calendartrash
|
||||
<EventOrganizerSubfieldName>|
|
||||
originalstart|originalstarttime|
|
||||
outofofficeproperties|
|
||||
<EventOutOfOfficePropertiesSubfieldName>
|
||||
<EventOutOfOfficePropertiesSubfieldName>|
|
||||
privatecopy|
|
||||
recurrence|
|
||||
recurringeventid|
|
||||
@@ -1962,6 +1965,7 @@ gam calendar <CalendarEntity> printevents <EventSelectProperty>* <EventDisplayPr
|
||||
[formatjson [quotechar <Character>]] [todrive <ToDriveAttribute>*]
|
||||
|
||||
<CalendarSettingsField> ::=
|
||||
autoacceptinvitations|
|
||||
conferenceproperties|
|
||||
description|
|
||||
id|
|
||||
@@ -1971,6 +1975,7 @@ gam calendar <CalendarEntity> printevents <EventSelectProperty>* <EventDisplayPr
|
||||
<CalendarSettingsFieldList> ::= "<CalendarSettingsField>(,<CalendarSettingsField>)*"
|
||||
|
||||
<CalendarSettings> ::=
|
||||
(autoacceptinvitations [<Boolean>])|
|
||||
(description <String>)|
|
||||
(location <String>)|
|
||||
(summary <String>)|
|
||||
@@ -1987,10 +1992,10 @@ gam calendar|calendars <CalendarEntity> modify <CalendarSettings>+
|
||||
# Chat Bot
|
||||
|
||||
<ChatContent> ::=
|
||||
((text <String>)|
|
||||
(textfile <FileName> [charset <Charset>])|
|
||||
(gdoc <UserGoogleDoc>)|
|
||||
(gcsdoc <StorageBucketObjectName>))
|
||||
(text <String>)|
|
||||
(textfile <FileName> [charset <Charset>])|
|
||||
(gdoc <UserGoogleDoc>)|
|
||||
(gcsdoc <StorageBucketObjectName>)
|
||||
|
||||
<ChatMember> ::= spaces/<String>/members/<String>
|
||||
<ChatMessage> ::= spaces/<String>/messages/<String>
|
||||
@@ -2232,36 +2237,6 @@ gam print browsertokens [todrive <ToDriveAttribute>*]
|
||||
[sortheaders]
|
||||
[formatjson [quotechar <Character>]]
|
||||
|
||||
# Chrome Installed Apps Counts
|
||||
|
||||
gam show chromeapps
|
||||
[(ou <OrgUnitItem>)|(ou_and_children <OrgUnitItem>)|
|
||||
(ous <OrgUnitList>)|(ous_and_children <OrgUnitList>)]
|
||||
[filter <String>]
|
||||
[orderby appname|apptype|installtype|numberofpermissions|totalinstallcount]
|
||||
[formatjson]
|
||||
gam print chromeapps [todrive <ToDriveAttribute>*]
|
||||
[(ou <OrgUnitItem>)|(ou_and_children <OrgUnitItem>)|
|
||||
(ous <OrgUnitList>)|(ous_and_children <OrgUnitList>)]
|
||||
[filter <String>]
|
||||
[orderby appname|apptype|installtype|numberofpermissions|totalinstallcount]
|
||||
[formatjson [quotechar <Character>]] [delimiter <Character>]
|
||||
|
||||
gam show chromeappdevices
|
||||
appid <AppID> apptype extension|app|theme|hostedapp|androidapp
|
||||
[(ou <OrgUnitItem>)|(ou_and_children <OrgUnitItem>)|
|
||||
(ous <OrgUnitList>)|(ous_and_children <OrgUnitList>)]
|
||||
[start <Date>] [end <Date>]
|
||||
[orderby deviceid|machine]
|
||||
[formatjson]
|
||||
gam print chromeappdevices [todrive <ToDriveAttribute>*]
|
||||
appid <AppID> apptype extension|app|theme|hostedapp|androidapp
|
||||
[(ou <OrgUnitItem>)|(ou_and_children <OrgUnitItem>)|
|
||||
(ous <OrgUnitList>)|(ous_and_children <OrgUnitList>)]
|
||||
[start <Date>] [end <Date>]
|
||||
[orderby deviceid|machine]
|
||||
[formatjson [quotechar <Character>]]
|
||||
|
||||
# Chrome Auto Update Expiration Counts
|
||||
|
||||
gam print chromeaues [todrive <ToDriveAttribute>*]
|
||||
@@ -2371,6 +2346,15 @@ gam show chromeprofilecommands <ChromeProfileNameEntity>
|
||||
gam print chromeprofilecommands <ChromeProfileNameEntity> [todrive <ToDriveAttribute>*]
|
||||
[formatjson [quotechar <Character>]]
|
||||
|
||||
# Chrome Device Counts
|
||||
|
||||
gam show chromedevicecounts
|
||||
(mode all|active|perboottype|perreleasechannel)* [date <Date>]
|
||||
[formatjson]
|
||||
gam print chromedevicecounts [todrive <ToDriveAttribute>*]
|
||||
(mode all|active|perboottype|perreleasechannel) [date <Date>]
|
||||
[formatjson [quotechar <Character>]]
|
||||
|
||||
# Chrome Versions Counts
|
||||
|
||||
gam show chromeversions
|
||||
@@ -3222,10 +3206,10 @@ gam course <CourseID> create|add alias <CourseAlias>
|
||||
gam course <CourseID> delete alias <CourseAlias>
|
||||
|
||||
<CourseAnnouncementContent> ::=
|
||||
((text <String>)|
|
||||
(textfile <FileName> [charset <Charset>])|
|
||||
(gdoc <UserGoogleDoc>)|
|
||||
(gcsdoc <StorageBucketObjectName>))
|
||||
(text <String>)|
|
||||
(textfile <FileName> [charset <Charset>])|
|
||||
(gdoc <UserGoogleDoc>)|
|
||||
(gcsdoc <StorageBucketObjectName>)
|
||||
|
||||
gam course <CourseID> create announcement
|
||||
<CourseAnnouncementContent> [scheduledtime <Time>] [state draft|published]
|
||||
@@ -3289,6 +3273,11 @@ gam print course-participants [todrive <ToDriveAttribute>*]
|
||||
[formatjson [quotechar <Character>]]
|
||||
[showitemcountonly]
|
||||
|
||||
gam print course-counts students|teachers [todrive <ToDriveAttribute>*]
|
||||
(course|class <CourseEntity>)*|([teacher <UserItem>] [student <UserItem>] [states <CourseStateList>])
|
||||
[mincount <Integer>]
|
||||
[formatjson [quotechar <Character>]]
|
||||
|
||||
<CourseAnnouncementFieldName> ::=
|
||||
alternatelink|
|
||||
assigneemode|
|
||||
@@ -3591,6 +3580,12 @@ gam show domainaliases|aliasdomains
|
||||
|
||||
# Domain - Contacts and Global Address List
|
||||
|
||||
<ContactNoteContent> ::=
|
||||
<String>|
|
||||
(file|textfile <FileName> [charset <Charset>])|
|
||||
(gdoc <UserGoogleDoc>)
|
||||
(gcsdoc <StorageBucketObjectName>)
|
||||
|
||||
<ContactAttribute> ::=
|
||||
(additionalname|middlename <String>)|
|
||||
(address clear|(work|home|other|<String> ((formatted|unstructured <String>)|(streetaddress <String>)|(pobox <String>)|
|
||||
@@ -3616,7 +3611,7 @@ gam show domainaliases|aliasdomains
|
||||
(mileage <String>)|
|
||||
(name <String>)|
|
||||
(nickname <String>)|
|
||||
(note <NoteContent>)|
|
||||
(note <ContactNoteContent>)|
|
||||
(occupation <String>)|
|
||||
(organization clear|(work|other|<String> <String> ((location <String>)|(department <String>)|(title <String>)|(jobdescription <String>)|(symbol <String>))* notprimary|primary))|
|
||||
(phone clear|(work|home|other|fax|work_fax|home_fax|other_fax|main|company_main|assistant|mobile|work_mobile|pager|work_pager|car|radio|callback|isdn|telex|tty_tdd|<String> <String> notprimary|primary))|
|
||||
@@ -4467,22 +4462,21 @@ gam print mobile [todrive <ToDriveAttribute>*]
|
||||
<OrgUnitFieldName> ::=
|
||||
description|
|
||||
id|orgunitid|
|
||||
inherit|blockinheritance|
|
||||
name|
|
||||
parentid|parentorgunitid|
|
||||
parent|parentorgunitpath|
|
||||
path|orgunitpath
|
||||
<OrgUnitFieldNameList> ::= "<OrgUnitFieldName>(,<OrgUnitFieldName>)*"
|
||||
|
||||
gam create|add org|ou <OrgUnitPath> [description <String>] [parent <OrgUnitItem>] [inherit|(blockinheritance False)] [buildpath]
|
||||
gam update org|ou <OrgUnitItem> [name <String>] [description <String>] [parent <OrgUnitItem>] [inherit|(blockinheritance False)]
|
||||
gam create|add org|ou <OrgUnitPath> [description <String>] [parent <OrgUnitItem>] [buildpath]
|
||||
gam update org|ou <OrgUnitItem> [name <String>] [description <String>] [parent <OrgUnitItem>]
|
||||
gam update org|ou <OrgUnitItem> add|move <CrOSTypeEntity> [quickcrosmove [<Boolean>]]
|
||||
gam update org|ou <OrgUnitItem> add|move <UserTypeEntity>
|
||||
gam update org|ou <OrgUnitItem> sync <CrOSTypeEntity> [removetoou <OrgUnitItem>] [quickcrosmove [<Boolean>]]
|
||||
gam update org|ou <OrgUnitItem> sync <UserTypeEntity> [removetoou <OrgUnitItem>]
|
||||
gam delete org|ou <OrgUnitItem>
|
||||
|
||||
gam update orgs|ous <OrgUnitEntity> [name <String>] [description <String>] [parent <OrgUnitItem>] [inherit|(blockinheritance False)]
|
||||
gam update orgs|ous <OrgUnitEntity> [name <String>] [description <String>] [parent <OrgUnitItem>]
|
||||
gam update orgs|ous <OrgUnitEntity> add|move <CrOSTypeEntity> [quickcrosmove [<Boolean>]]
|
||||
gam update orgs|ous <OrgUnitEntity> add|move <UserTypeEntity>
|
||||
gam update orgs|ous <OrgUnitEntity> sync <CrOSTypeEntity> [removetoou <OrgUnitItem>] [quickcrosmove [<Boolean>]]
|
||||
@@ -4591,28 +4585,41 @@ gam report usage customer [todrive <ToDriveAttribute>*]
|
||||
[convertmbtogb]
|
||||
|
||||
<ActivityApplicationName> ::=
|
||||
accessevaluation|
|
||||
accesstransparency|access|
|
||||
admin|
|
||||
admindataaction|
|
||||
assignments|
|
||||
calendar|calendars|
|
||||
chat|
|
||||
chrome|
|
||||
classroom|
|
||||
cloudsearch|
|
||||
contacts|
|
||||
contextawareaccess|
|
||||
datamigration|
|
||||
datastudio|
|
||||
directorysync|
|
||||
drive|doc|docs|
|
||||
gcp|cloud|
|
||||
geminiinworkspaceapps|gemini|geminiforworkspace|
|
||||
gmail|
|
||||
gplus|currents|google+|
|
||||
graduation|
|
||||
groups|group|
|
||||
groupsenterprise|enterprisegroups|
|
||||
jamboard|
|
||||
keep|
|
||||
ldap|
|
||||
login|logins|
|
||||
meet|hangoutsmeet|
|
||||
meethardware|
|
||||
mobile|devices|
|
||||
profile|
|
||||
rules|
|
||||
saml|
|
||||
takeout|
|
||||
tasks|
|
||||
token|tokens|oauthtoken|
|
||||
useraccounts|
|
||||
vault
|
||||
@@ -4623,7 +4630,7 @@ gam report <ActivityApplicationName> [todrive <ToDriveAttribute>*]
|
||||
yesterday|today|thismonth|(previousmonths <Integer>)]
|
||||
[filter <String> (filtertime<String> <Time>)*]
|
||||
[event|events <EventNameList>] [ip <String>]
|
||||
[groupidfilter <String>]
|
||||
[groupidfilter <String>] [resourcedetailsfilter <String>]
|
||||
[maxactivities <Number>] [maxevents <Number>] [maxresults <Number>]
|
||||
[countsonly [bydate|summary] [eventrowfilter]]
|
||||
(addcsvdata <FieldName> <String>)* [shownoactivities]
|
||||
@@ -4745,6 +4752,7 @@ gam print resoldsubscriptions [todrive <ToDriveAttribute>*]
|
||||
(zipcode|postalcode <String>)
|
||||
|
||||
<ResourceAttribute> ::=
|
||||
(autoacceptinvitations [<Boolean>])|
|
||||
(addfeatures <FeatureNameList>)|
|
||||
(buildingid <BuildingID>)|
|
||||
(capacity <Number>)|
|
||||
@@ -4760,6 +4768,7 @@ gam print resoldsubscriptions [todrive <ToDriveAttribute>*]
|
||||
|
||||
<ResourceFieldName> ::=
|
||||
acls|
|
||||
autoacceptinvitations|
|
||||
buildingid|
|
||||
calendar|
|
||||
capacity|
|
||||
@@ -5202,11 +5211,13 @@ gam copy shareddriveacls <SharedDriveEntity> to <SharedDriveEntity>
|
||||
[adminaccess|asadmin]
|
||||
[showpermissionsmessages [<Boolean>]]
|
||||
[excludepermissionsfromdomains|includepermissionsfromdomains <DomainNameList>]
|
||||
(mappermissionsemail <EmailAddress> <EmailAddress>)* [mappermissionsemailfile <CSVFileInput> endcsv]
|
||||
(mappermissionsdomain <DomainName> <DomainName>)*
|
||||
gam sync shareddriveacls <SharedDriveEntity> with <SharedDriveEntity>
|
||||
[adminaccess|asadmin]
|
||||
[showpermissionsmessages [<Boolean>]]
|
||||
[excludepermissionsfromdomains|includepermissionsfromdomains <DomainNameList>]
|
||||
(mappermissionsemail <EmailAddress> <EmailAddress>)* [mappermissionsemailfile <CSVFileInput> endcsv]
|
||||
(mappermissionsdomain <DomainName> <DomainName>)*
|
||||
|
||||
gam print shareddriveacls [todrive <ToDriveAttribute>*]
|
||||
@@ -5231,11 +5242,13 @@ gam <UserTypeEntity> copy shareddriveacls <SharedDriveEntity> to <SharedDriveEnt
|
||||
[adminaccess|asadmin]
|
||||
[showpermissionsmessages [<Boolean>]]
|
||||
[excludepermissionsfromdomains|includepermissionsfromdomains <DomainNameList>]
|
||||
(mappermissionsemail <EmailAddress> <EmailAddress>)* [mappermissionsemailfile <CSVFileInput> endcsv]
|
||||
(mappermissionsdomain <DomainName> <DomainName>)*
|
||||
gam <UserTypeEntity> sync shareddriveacls <SharedDriveEntity> with <SharedDriveEntity>
|
||||
[adminaccess|asadmin]
|
||||
[showpermissionsmessages [<Boolean>]]
|
||||
[excludepermissionsfromdomains|includepermissionsfromdomains <DomainNameList>]
|
||||
(mappermissionsemail <EmailAddress> <EmailAddress>)* [mappermissionsemailfile <CSVFileInput> endcsv]
|
||||
(mappermissionsdomain <DomainName> <DomainName>)*
|
||||
|
||||
gam <UserTypeEntity> print shareddriveacls [todrive <ToDriveAttribute>*]
|
||||
@@ -5425,7 +5438,7 @@ gam print vaultcounts [todrive <ToDriveAttributes>*]
|
||||
[wait <Integer>]
|
||||
gam print vaultcounts [todrive <ToDriveAttributes>*]
|
||||
matter <MatterItem>
|
||||
corpus mail|groups
|
||||
corpus mail|groups
|
||||
[scope [all_data|held_data|unprocessed_data]]
|
||||
[(accounts <EmailAddressEntity>) | (orgunit|org|ou <OrgUnitPath>) | everyone]
|
||||
[terms <String>] [start|starttime <Date>|<Time>] [end|endtime <Date>|<Time>] [timezone <TimeZone>]
|
||||
@@ -5587,7 +5600,7 @@ gam create vaultquery <MatterItem> [name <String>]
|
||||
[locationquery <StringList>] [peoplequery <StringList>] [minuswords <StringList>]
|
||||
[responsestatuses <AttendeeStatus>(,<AttendeeStatus>)*] [calendarversiondate <Date>|<Time>]
|
||||
(covereddata calllogs|textmessages|voicemails)*
|
||||
[<JSONData>]
|
||||
[<JSONData>]
|
||||
[shownames]
|
||||
[showdetails|returnidonly|formatjson]
|
||||
|
||||
@@ -5681,6 +5694,11 @@ gam download storagefile <StorageBucketObjectName>
|
||||
<UserOrderByFieldName> ::=
|
||||
familyname|lastname|givenname|firstname|email
|
||||
|
||||
<UserNoteContent> ::=
|
||||
<String>|
|
||||
(file|textfile|htmlfile <FileName> [charset <Charset>])|
|
||||
(gdoc|ghtml <UserGoogleDoc>)
|
||||
|
||||
<UserBasicAttribute> ::=
|
||||
(archive|archived <Boolean>)|
|
||||
(changepassword|changepasswordatnextlogin <Boolean>)|
|
||||
@@ -5694,9 +5712,7 @@ gam download storagefile <StorageBucketObjectName>
|
||||
(ipwhitelisted <Boolean>)|
|
||||
(language clear|<LanguageList>)|
|
||||
(lastname|familyname <String>)|
|
||||
(note clear|([text_html|text_plain] <String>|
|
||||
(file|htmlfile <FileName> [charset <Charset>])|
|
||||
(gdoc|ghtml <UserGoogleDoc>)))|
|
||||
(note clear|([text_html|text_plain] <UserNoteContent))|
|
||||
(ou|org|orgunitpath <OrgUnitPath>|<OrgUnitID>)
|
||||
(password (random [<Integer>])|(uniquerandom [<Integer>])|
|
||||
blocklogin|
|
||||
@@ -6067,6 +6083,7 @@ gam <UserTypeEntity> print backupcodes|verificationcodes [todrive <ToDriveAttrib
|
||||
(summary <String>)
|
||||
|
||||
<CalendarSettings> ::=
|
||||
(autoacceptinvitations [<Boolean>])|
|
||||
(description <String>)|
|
||||
(location <String>)|
|
||||
(summary <String>)|
|
||||
@@ -6109,7 +6126,7 @@ gam <UserTypeEntity> show calendars
|
||||
[formatjson]
|
||||
gam <UserTypeEntity> print calendars [todrive <ToDriveAttribute>*]
|
||||
[primary] <CalendarSelectProperty>* [noprimary] [nogroups] [noresources] [nosystem] [nousers]
|
||||
[fields <CalendarListFieldList>] [permissions]
|
||||
[fields <CalendarListFieldList>] [permissions] [oneitemperrow]
|
||||
[formatjson] [delimiter <Character>] [quotechar <Character>]
|
||||
|
||||
Display a users calendar settings
|
||||
@@ -6227,6 +6244,7 @@ gam <UserTypeEntity> transfer calendars|seccals <UserItem> [<UserCalendarEntity>
|
||||
(birthday <Date>)|
|
||||
(color <EventColorName>)|
|
||||
(colorindex|colorid <EventColorIndex>)|
|
||||
(conferencedata meet <MeetID>)|
|
||||
(description <String>)|
|
||||
(end|endtime (allday <Date>)|<Time>)|
|
||||
(guestscaninviteothers <Boolean>)|
|
||||
@@ -6234,7 +6252,7 @@ gam <UserTypeEntity> transfer calendars|seccals <UserItem> [<UserCalendarEntity>
|
||||
(guestscanmodify <Boolean>)|
|
||||
(guestscanseeotherguests <Boolean>)|
|
||||
guestscantseeotherguests|
|
||||
hangoutsmeet|
|
||||
googlemeet|hangoutsmeet|
|
||||
<JSONData>|
|
||||
(jsonattendees [charset <Charset>] <String>)|
|
||||
(jsonattendees file <FileName> [charset <Charset>])|
|
||||
@@ -6246,6 +6264,7 @@ gam <UserTypeEntity> transfer calendars|seccals <UserItem> [<UserCalendarEntity>
|
||||
(range <Date> <Date>)|
|
||||
(recurrence <RRULE, EXRULE, RDATE and EXDATE line>)|
|
||||
(reminder <Number> email|popup)|
|
||||
(resource <ResourceID>)|
|
||||
(selectattendees [<AttendeeAttendance>] [<AttendeeStatus>] <UserTypeEntity>)|
|
||||
(sequence <Integer>)|
|
||||
(sharedproperty <PropertyKey> <PropertyValue>)|
|
||||
@@ -6274,10 +6293,12 @@ The following attributes are equivalent:
|
||||
<EventAttribute>|
|
||||
clearattachments|
|
||||
clearattendees|
|
||||
clearhangoutsmeet|
|
||||
cleargooglemeet|clearhangoutsmeet|
|
||||
(clearprivateproperty <PropertyKey>)|
|
||||
clearresources|
|
||||
(clearsharedproperty <PropertyKey>)|
|
||||
(removeattendee <EmailAddress>)|
|
||||
(removeresource <ResourceID>)|
|
||||
(replacedescription <REMatchPattern> <RESubstitution>)|
|
||||
(selectremoveattendees <UserTypeEntity>)
|
||||
|
||||
@@ -6326,7 +6347,7 @@ gam <UserTypeEntity> print events <UserCalendarEntity> [<EventEntity>] <EventDis
|
||||
|
||||
gam <UserTypeEntity> update calattendees <UserCalendarEntity> <EventEntity> [anyorganizer]
|
||||
[<EventNotificationAttribute>] [splitupdate] [dryrun|doit]
|
||||
(csv|csvfile <CSVFileInput>)
|
||||
(csv|csvfile <CSVFileInput> endcsv)
|
||||
(delete <EmailAddress>)*
|
||||
(deleteentity <EmailAddressEntity>)*
|
||||
(add <EmailAddress>)*
|
||||
@@ -6345,14 +6366,25 @@ gam <UserTypeEntity> create focustime
|
||||
[declinemode none|all|new]
|
||||
[declinemessage <String>]
|
||||
[summary <String>]
|
||||
(timerange <Time> <Time> [recurrence <String>])+
|
||||
((date yyyy-mm-dd)|
|
||||
(range yyyy-mm-dd yyyy-mm-dd)|
|
||||
(daily yyyy-mm-dd N)|
|
||||
(weekly yyyy-mm-dd N)|
|
||||
(timerange <Time> <Time> (recurrence <RRULE, EXRULE, RDATE and EXDATE line>)*))+
|
||||
[timezone <String>]
|
||||
(noreminders|(reminder email|popup <Number>)+)
|
||||
|
||||
gam <UserTypeEntity> create outofoffice
|
||||
[declinemode none|all|new]
|
||||
[declinemessage <String>]
|
||||
[summary <String>]
|
||||
(timerange <Time> <Time> [recurrence <String>])+
|
||||
((date yyyy-mm-dd)|
|
||||
(range yyyy-mm-dd yyyy-mm-dd)|
|
||||
(daily yyyy-mm-dd N)|
|
||||
(weekly yyyy-mm-dd N)|
|
||||
(timerange <Time> <Time>) (recurrence <RRULE, EXRULE, RDATE and EXDATE line>)*)+
|
||||
[timezone <String>]
|
||||
(noreminders|(reminder email|popup <Number>)+)
|
||||
|
||||
gam <UserTypeEntity> create workinglocation
|
||||
(home|
|
||||
@@ -6363,8 +6395,9 @@ gam <UserTypeEntity> create workinglocation
|
||||
(range yyyy-mm-dd yyyy-mm-dd)|
|
||||
(daily yyyy-mm-dd N)|
|
||||
(weekly yyyy-mm-dd N)|
|
||||
(timerange <Time> <Time>))+
|
||||
(timerange <Time> <Time>) (recurrence <RRULE, EXRULE, RDATE and EXDATE line>)*)+
|
||||
[timezone <String>]
|
||||
(noreminders|(reminder email|popup <Number>)+)
|
||||
|
||||
gam <UserTypeEntity> delete focustime|outofoffice|workinglocation
|
||||
((date yyyy-mm-dd)|
|
||||
@@ -6393,10 +6426,10 @@ gam <UserTypeEntity> print focustime|outofoffice|workinglocation
|
||||
# Users - Chat
|
||||
|
||||
<ChatContent> ::=
|
||||
((text <String>)|
|
||||
(textfile <FileName> [charset <Charset>])|
|
||||
(gdoc <UserGoogleDoc>)|
|
||||
(gcsdoc <StorageBucketObjectName>))
|
||||
(text <String>)|
|
||||
(textfile <FileName> [charset <Charset>])|
|
||||
(gdoc <UserGoogleDoc>)|
|
||||
(gcsdoc <StorageBucketObjectName>)
|
||||
|
||||
<ChatMember> ::= spaces/<String>/members/<String>
|
||||
<ChatMemberList> ::= "<ChatMember>(,<ChatMember>)*"
|
||||
@@ -6825,6 +6858,7 @@ gam <UserTypeEntity> copy drivefile <DriveFileEntity>
|
||||
[copypermissionroles <DriveFileACLRoleList>]
|
||||
[copypermissiontypes <DriveFileACLTypeList>]
|
||||
[excludepermissionsfromdomains|includepermissionsfromdomains <DomainNameList>]
|
||||
(mappermissionsemail <EmailAddress> <EmailAddress>)* [mappermissionsemailfile <CSVFileInput> endcsv]
|
||||
(mappermissionsdomain <DomainName> <DomainName>)*
|
||||
[copysheetprotectedranges [<Boolean>]]
|
||||
[copysheetprotectedrangesinheritedpermissions [<Boolean>]]
|
||||
@@ -6851,8 +6885,8 @@ gam <UserTypeEntity> move drivefile <DriveFileEntity> [newfilename <DriveFileNam
|
||||
[copysubfolderinheritedpermissions [<Boolean>]]
|
||||
[copysubfoldernoniheritedpermissions never|always|syncallfolders|syncupdatedfolders]
|
||||
[excludepermissionsfromdomains|includepermissionsfromdomains <DomainNameList>]
|
||||
(mappermissionsemail <EmailAddress> <EmailAddress>)* [mappermissionsemailfile <CSVFileInput> endcsv]
|
||||
(mappermissionsdomain <DomainName> <DomainName>)*
|
||||
[updatefilepermissions [<Boolean>]]
|
||||
[retainsourcefolders [<Boolean>]]
|
||||
[sendemailifrequired [<Boolean>]]
|
||||
[verifyorganizer [<Boolean>]]
|
||||
@@ -7894,9 +7928,9 @@ gam <UserTypeEntity> show messages|threads
|
||||
[labelids <LabelIDList>]
|
||||
[quick|notquick] [max_to_show <Number>] [includespamtrash])|(ids <MessageIDEntity>)
|
||||
[labelmatchpattern <REMatchPattern>] [sendermatchpattern <REMatchPattern>]
|
||||
[countsonly|positivecountsonly] [useronly]
|
||||
[countsonly|positivecountsonly]
|
||||
[headers all|<SMTPHeaderList>] [dateheaderformat iso|rfc2822|<String>] [dateheaderconverttimezone [<Boolean>]]
|
||||
[showlabels] [delimiter <Character>] [showbody] [showhtml] [showdate] [showsize] [showsnippet]
|
||||
[showlabels] [useronly] [delimiter <Character>] [showbody] [showhtml] [showdate] [showsize] [showsnippet]
|
||||
[maxmessagesperthread <Number>]
|
||||
[[attachmentnamepattern <REMatchPattern>]
|
||||
[showattachments [noshowtextplain]]
|
||||
@@ -7907,9 +7941,9 @@ gam <UserTypeEntity> print messages|threads [todrive <ToDriveAttribute>*]
|
||||
[labelids <LabelIDList>]
|
||||
[quick|notquick] [max_to_print <Number>] [includespamtrash])|(ids <MessageIDEntity>)
|
||||
[labelmatchpattern <REMatchPattern>] [sendermatchpattern <REMatchPattern>]
|
||||
[countsonly|positivecountsonly] [useronly]
|
||||
[countsonly|positivecountsonly]
|
||||
[headers all|<SMTPHeaderList>] [dateheaderformat iso|rfc2822|<String> [dateheaderconverttimezone [<Boolean>]]]
|
||||
[showlabels] [delimiter <Character>] [showbody] [showhtml] [showdate] [showsize] [showsnippet]
|
||||
[showlabels] [useronly] [delimiter <Character>] [showbody] [showhtml] [showdate] [showsize] [showsnippet]
|
||||
[maxmessagesperthread <Number>]
|
||||
[convertcrnl] [delimiter <Character>]
|
||||
[[attachmentnamepattern <REMatchPattern>]
|
||||
@@ -8083,16 +8117,16 @@ gam <UserTypeEntity> check isinvitable [todrive <ToDriveAttribute>*]
|
||||
|
||||
# Users - Keep Notes
|
||||
|
||||
<NoteContent> ::=
|
||||
((text <String>)|
|
||||
(textfile <FileName> [charset <Charset>])|
|
||||
(gdoc <UserGoogleDoc>)|
|
||||
(gcsdoc <StorageBucketObjectName>)|
|
||||
<JSONData>)
|
||||
<KeepNoteContent> ::=
|
||||
(text <String>)|
|
||||
(textfile <FileName> [charset <Charset>])|
|
||||
(gdoc <UserGoogleDoc>)|
|
||||
(gcsdoc <StorageBucketObjectName>)|
|
||||
<JSONData>
|
||||
|
||||
gam <UserTypeEntity> create note [title <String>]
|
||||
[missingtextvalue <String>]
|
||||
<NoteContent>
|
||||
<KeepNoteContent>
|
||||
[copyacls [copyowneraswriter]]
|
||||
[compact|formatjson|nodetails]
|
||||
|
||||
@@ -8263,12 +8297,17 @@ gam <UserItem> print meettranscripts <MeetConferenceName> [todrive <ToDriveAttri
|
||||
|
||||
# Users - Contacts and Profiles
|
||||
|
||||
<BiographyContent> ::=
|
||||
<String>|
|
||||
(file|textfile <FileName> [charset <Charset>])|
|
||||
(gdoc <UserGoogleDoc>)
|
||||
|
||||
<PeopleContactAttribute> ::=
|
||||
(additionalname|middlename <String>)|
|
||||
(address clear|(work|home|other|<String> ((formatted|unstructured <String>)|(streetaddress <String>)|(pobox <String>)|
|
||||
(neighborhood <String>)|(locality <String>)|(region <String>)|(postalcode <String>)|(country <String>))* notprimary|primary))|
|
||||
(billinginfo <String>)|
|
||||
(biography|biographies <String>|(file <FileName> [charset <Charset>])|(gdoc <UserGoogleDoc>))|
|
||||
(biography|biographies <BiographyContent)|
|
||||
(birthday <Date>)|
|
||||
(calendar clear|(work|home|free-busy|<String> <URL> notprimary|primary))|
|
||||
(clientdata <String> <String>)|
|
||||
|
||||
@@ -1,3 +1,170 @@
|
||||
7.30.04
|
||||
|
||||
Updated `gam report gmail` to avoid the following error when incomplete start/end time information is provided.
|
||||
```
|
||||
ERROR: Invalid request: Start time and end time should both be provided, and the scan duration should not be greater than 30 days.
|
||||
```
|
||||
* No time information provided - GAM sets `range -30d today`
|
||||
* Only `start <Time>` provided - GAM sets `end <Time>+30d`
|
||||
* Only `end <Time>` provided - GAM sets `start <Time>-30d`
|
||||
|
||||
7.30.03
|
||||
|
||||
Updated `gam report <ActivityApplicationName>` to reflect the changes described here:
|
||||
* See: https://workspaceupdates.googleblog.com/2025/12/google-workspace-audit-log-api.html
|
||||
|
||||
Added option `resourcedetailsfilter <String>` to `gam report <ActivityApplicationName>` described here:
|
||||
* See: https://developers.google.com/workspace/admin/reports/reference/rest/v1/activities/list#query-parameters
|
||||
|
||||
For `gam <UserTypeEntity> print <Objects>`, expanded the list of `<Objects>` covered by `gam.cfg csv_output_users_audit = True`.
|
||||
|
||||
7.30.02
|
||||
|
||||
Added option `conferencedata meet <MeetID>` to `<EventAttribute>` that allows specifying
|
||||
a reference to an existing Google Meet when creating/updating a calendar event.
|
||||
|
||||
Upgraded to Python 3.14.2.
|
||||
|
||||
7.30.01
|
||||
|
||||
Fixed bug introduced in 7.30.00 that caused errors when reading CSV files.
|
||||
|
||||
Added the following options to `gam <UserTypeEntity> create focustime|outofoffice`:
|
||||
```
|
||||
((date yyyy-mm-dd)|
|
||||
(range yyyy-mm-dd yyyy-mm-dd)|
|
||||
(daily yyyy-mm-dd N)|
|
||||
(weekly yyyy-mm-dd N))
|
||||
```
|
||||
|
||||
Added the following options to `gam <UserTypeEntity> create focustime|outofoffice|workinglocation`:
|
||||
```
|
||||
noreminders|(reminder email|popup <Number>)+
|
||||
```
|
||||
|
||||
7.30.00
|
||||
|
||||
Added `input_dir` directory variable to `gam.cfg` that is used to select a directory for reading files with non-absolute file names.
|
||||
The default is '.' that matches the current behavior where these files are read from the current working directory.
|
||||
This will be most useful in multiple domain situations where each domain will have distinct `drive_dir` and `input_dir` values.
|
||||
|
||||
Added support for the new resource calendar setting `autoAcceptInvitations`.
|
||||
|
||||
7.29.04
|
||||
|
||||
Updated `gam delete chromepolicy chrome.users.apps.InstallType ou <OrgUnitItem> appid <AppID>`
|
||||
to allow deleting an app, i.e., explicitly remove it from management. `<OrgUnitItem>` must specify where it was added for management.
|
||||
|
||||
7.29.03
|
||||
|
||||
Remove debugging message from `gam <UserTypeEntity> move drivefile <DriveFileEntity>`.
|
||||
|
||||
7.29.02
|
||||
|
||||
Fixed bug in `gam <UserTypeEntity> move drivefile <DriveFileEntity>` where the following options
|
||||
were only applied to top level files or folders re-created in the destination. Now, domain
|
||||
and email address mappings apply to all moved files/folders.
|
||||
```
|
||||
excludepermissionsfromdomains <DomainNameList>
|
||||
includepermissionsfromdomains <DomainNameList>
|
||||
mappermissionsdomain <DomainName> <DomainName>
|
||||
mappermissionsemail <EmailAddress> <EmailAddress>
|
||||
mappermissionsemailfile <CSVFileInput> endcsv
|
||||
```
|
||||
|
||||
Upgraded to Python 3.14.1.
|
||||
|
||||
7.29.01
|
||||
|
||||
Added option `oneitemperrow` to `gam <UserTypeEntity> print calendars ... permissions` to have each of a
|
||||
calendar's permissions displayed on a separate row with all of the other calendar fields.
|
||||
|
||||
Updated `gam yubikey reset_piv` to handle YubiKey firmware updates that caused an error.
|
||||
|
||||
7.29.00
|
||||
|
||||
Added options `mappermissionsemail <EmailAddress> <EmailAddress>` and ` mappermissionsemailfile <CSVFileInput> endcsv`
|
||||
to these commands:
|
||||
```
|
||||
gam [<UserTypeEntity>] copy shareddriveacls <SharedDriveEntity> to <SharedDriveEntity>
|
||||
gam [<UserTypeEntity>] sync shareddriveacls <SharedDriveEntity> with <SharedDriveEntity>
|
||||
gam <UserTypeEntity> copy drivefile <DriveFileEntity>
|
||||
gam <UserTypeEntity> move drivefile <DriveFileEntity>
|
||||
```
|
||||
When `mappermissionsemail <EmailAddress> <EmailAddress>` is specifed, an ACL that references the first `<EmailAddress>`
|
||||
in the source will be modified to reference the second `<EmailAddress>` in the destination.
|
||||
|
||||
Bulk permission email address mapping can be specified with `mappermissionsemailfile <CSVFileInput> endcsv`.
|
||||
`<CSVFileInput>` must include these columns: `sourceEmail` and `destinationEmail`.
|
||||
|
||||
These options will be most useful with inter-workspace Shared Drive copies and moves.
|
||||
|
||||
7.28.13
|
||||
|
||||
Added option `addcsvdata <FieldName> <String>` to `gam <UserTypeEntity> print messages`
|
||||
that adds additional columns of data to the CSV file output.
|
||||
|
||||
7.28.12
|
||||
|
||||
Updated `gam delete project` to handle the following error:
|
||||
```
|
||||
ERROR: 400: failedPrecondition - Project not active
|
||||
```
|
||||
|
||||
7.28.11
|
||||
|
||||
Removed all options/fields referencing inheritance from `gam create|update|info|print org` as this option/field is deprecated.
|
||||
|
||||
7.28.10
|
||||
|
||||
Added a command `gam print course-counts` that dsplays the count of the number of courses in which a teacher or student is a participant.
|
||||
|
||||
* See: https://github.com/GAM-team/GAM/wiki/Classroom-Membership#display-course-counts-for-teachers-students
|
||||
|
||||
7.28.09
|
||||
|
||||
Fixed bug in `gam print cigroups ... descriptionmatchpattern [not] <REMatchPattern>` that caused a trap.
|
||||
|
||||
7.28.08
|
||||
|
||||
Updated `gam <UserTypeEntity> print|show chatmessages` to cache the sender UID to email address
|
||||
map so that each sender UID only has to be looked up once; this improves performance.
|
||||
|
||||
7.28.07
|
||||
|
||||
Fixed bug in `gam report users ... aggregatebydate|aggregatebyuser` where `accounts:used_quota_in_percentage` was incorrectly displayed.
|
||||
|
||||
7.28.06
|
||||
|
||||
Updated `gam <UserTypeEntity> info|print|show calendars` and
|
||||
`gam calendars <CalendarEntity> print|show settings` to display the
|
||||
new `dataOwner` field as described under `Additional details` below.
|
||||
|
||||
* See: https://workspaceupdates.googleblog.com/2025/11/secondary-calendar-management-with-dedicated-owners.html
|
||||
|
||||
7.28.04
|
||||
|
||||
Updated commands that display Chrome device counts to display the date in the output.
|
||||
|
||||
* See: https://github.com/GAM-team/GAM/wiki/Chrome-Device-Counts
|
||||
|
||||
7.28.03
|
||||
|
||||
Improved commands to display Chrome device counts.
|
||||
|
||||
* See: https://github.com/GAM-team/GAM/wiki/Chrome-Device-Counts
|
||||
|
||||
7.28.02
|
||||
|
||||
Added commands to display Chrome device counts.
|
||||
|
||||
* See: https://github.com/GAM-team/GAM/wiki/Chrome-Device-Counts
|
||||
|
||||
7.28.01
|
||||
|
||||
Updated `gam <UserTypeEntity> show fileinfo <DriveFileEntity>` to display `displayName` as the key field
|
||||
of a `permission` not `deleted`.
|
||||
|
||||
7.28.00
|
||||
|
||||
Added option `addcsvdata <FieldName> <String>` to `gam report [usage] customers|users`
|
||||
@@ -17280,7 +17447,7 @@ Current version of Gam with drive_v3_name_names = false
|
||||
Owner,title,parents,parents.0.id,parents.1.id
|
||||
testuser@domain.com,TestFile,2,PPPP1111,PPPP2222
|
||||
|
||||
Current version of Gam with drive_v3_name_names = true
|
||||
Current version of Gam with drive_v3_name_names = true
|
||||
Owner,name,parents
|
||||
testuser@domain.com,TestFile,PPPP1111 PPPP2222
|
||||
|
||||
|
||||
1383
src/gam/__init__.py
1383
src/gam/__init__.py
File diff suppressed because it is too large
Load Diff
@@ -50,6 +50,7 @@ CLOUDIDENTITY_INBOUND_SSO = 'cloudidentityinboundsso'
|
||||
CLOUDIDENTITY_ORGUNITS = 'cloudidentityorgunits'
|
||||
CLOUDIDENTITY_ORGUNITS_BETA = 'cloudidentityorgunitsbeta'
|
||||
CLOUDIDENTITY_POLICY = 'cloudidentitypolicy'
|
||||
CLOUDIDENTITY_POLICY_BETA = 'cloudidentitypolicybeta'
|
||||
CLOUDIDENTITY_USERINVITATIONS = 'cloudidentityuserinvitations'
|
||||
CLOUDRESOURCEMANAGER = 'cloudresourcemanager'
|
||||
CONTACTS = 'contacts'
|
||||
@@ -245,6 +246,7 @@ _INFO = {
|
||||
CLOUDIDENTITY_ORGUNITS: {'name': 'Cloud Identity API - OrgUnits', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
|
||||
CLOUDIDENTITY_ORGUNITS_BETA: {'name': 'Cloud Identity API - OrgUnits Beta', 'version': 'v1beta1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
|
||||
CLOUDIDENTITY_POLICY: {'name': 'Cloud Identity API - Policy', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
|
||||
CLOUDIDENTITY_POLICY_BETA: {'name': 'Cloud Identity API - Policy Beta', 'version': 'v1beta1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
|
||||
CLOUDIDENTITY_USERINVITATIONS: {'name': 'Cloud Identity API - User Invitations', 'version': 'v1', 'v2discovery': True, 'mappedAPI': 'cloudidentity'},
|
||||
CLOUDRESOURCEMANAGER: {'name': 'Cloud Resource Manager API v3', 'version': 'v3', 'v2discovery': True},
|
||||
CONTACTS: {'name': 'Contacts API', 'version': 'v3', 'v2discovery': False},
|
||||
@@ -397,8 +399,12 @@ _CLIENT_SCOPES = [
|
||||
'api': CLOUDIDENTITY_POLICY,
|
||||
'subscopes': READONLY,
|
||||
'roByDefault': True,
|
||||
'scope': 'https://www.googleapis.com/auth/cloud-identity.policies'
|
||||
},
|
||||
'scope': 'https://www.googleapis.com/auth/cloud-identity.policies'},
|
||||
{'name': 'Cloud Identity API - Policy Beta',
|
||||
'api': CLOUDIDENTITY_POLICY_BETA,
|
||||
'subscopes': [],
|
||||
'offByDefault': True,
|
||||
'scope': 'https://www.googleapis.com/auth/cloud-identity.policies'},
|
||||
{'name': 'Cloud Identity API - User Invitations',
|
||||
'api': CLOUDIDENTITY_USERINVITATIONS,
|
||||
'subscopes': READONLY,
|
||||
@@ -413,7 +419,7 @@ _CLIENT_SCOPES = [
|
||||
'subscopes': [],
|
||||
'offByDefault': True,
|
||||
'scope': STORAGE_READWRITE_SCOPE},
|
||||
{'name': 'Contacts API - Domain Shared Contacts and GAL',
|
||||
{'name': 'Contacts API - Domain Shared Contacts',
|
||||
'api': CONTACTS,
|
||||
'subscopes': [],
|
||||
'scope': 'https://www.google.com/m8/feeds'},
|
||||
|
||||
@@ -157,7 +157,7 @@ DEVELOPER_PREVIEW_API_KEY = 'developer_preview_api_key'
|
||||
DEVICE_MAX_RESULTS = 'device_max_results'
|
||||
# Domain obtained from gam.cfg or oauth2.txt
|
||||
DOMAIN = 'domain'
|
||||
# Google Drive download directory
|
||||
# directory for file output
|
||||
DRIVE_DIR = 'drive_dir'
|
||||
# When retrieving lists of Drive files/folders from API, how many should be retrieved in each chunk
|
||||
DRIVE_MAX_RESULTS = 'drive_max_results'
|
||||
@@ -177,6 +177,8 @@ EXTRA_ARGS = 'extra_args'
|
||||
GMAIL_CSE_INCERT_DIR = 'gmail_cse_incert_dir'
|
||||
# Gmail CSE KACL wrapped key files
|
||||
GMAIL_CSE_INKEY_DIR = 'gmail_cse_inkey_dir'
|
||||
# directory for file input
|
||||
INPUT_DIR = 'input_dir'
|
||||
# When processing items in batches, how many seconds should GAM wait between batches
|
||||
INTER_BATCH_WAIT = 'inter_batch_wait'
|
||||
# When retrieving lists of licenses from API, how many should be retrieved in each chunk
|
||||
@@ -394,6 +396,7 @@ Defaults = {
|
||||
EXTRA_ARGS: '',
|
||||
GMAIL_CSE_INCERT_DIR: '',
|
||||
GMAIL_CSE_INKEY_DIR: '',
|
||||
INPUT_DIR: '.',
|
||||
INTER_BATCH_WAIT: '0',
|
||||
LICENSE_MAX_RESULTS: '100',
|
||||
LICENSE_SKUS: '',
|
||||
@@ -564,6 +567,7 @@ VAR_INFO = {
|
||||
EXTRA_ARGS: {VAR_TYPE: TYPE_FILE, VAR_SIGFILE: FN_EXTRA_ARGS_TXT, VAR_SFFT: ('', FN_EXTRA_ARGS_TXT), VAR_ACCESS: os.R_OK},
|
||||
GMAIL_CSE_INCERT_DIR: {VAR_TYPE: TYPE_DIRECTORY},
|
||||
GMAIL_CSE_INKEY_DIR: {VAR_TYPE: TYPE_DIRECTORY},
|
||||
INPUT_DIR: {VAR_TYPE: TYPE_DIRECTORY},
|
||||
INTER_BATCH_WAIT: {VAR_TYPE: TYPE_FLOAT, VAR_LIMITS: (0.0, 60.0)},
|
||||
LICENSE_MAX_RESULTS: {VAR_TYPE: TYPE_INTEGER, VAR_LIMITS: (10, 1000)},
|
||||
LICENSE_SKUS: {VAR_TYPE: TYPE_STRING, VAR_LIMITS: (0, None)},
|
||||
|
||||
@@ -754,6 +754,7 @@ class GamCLArgs():
|
||||
ARG_CHATSPACE = 'chatspace'
|
||||
ARG_CHATSPACES = 'chatspaces'
|
||||
ARG_CHATSPACEDM = 'chatspacedm'
|
||||
ARG_CHROMEDEVICECOUNTS = 'chromedevicecounts'
|
||||
ARG_CHROMEAPP = 'chromeapp'
|
||||
ARG_CHROMEAPPS = 'chromeapps'
|
||||
ARG_CHROMEAPPDEVICES = 'chromeappdevices'
|
||||
@@ -787,6 +788,7 @@ class GamCLArgs():
|
||||
ARG_CLASSIFICATIONLABELPERMISSIONS = 'classificationlabelpermissions'
|
||||
ARG_CLASS = 'class'
|
||||
ARG_CLASSES = 'classes'
|
||||
ARG_CLASSCOUNTS = 'classcounts'
|
||||
ARG_CLASSPARTICIPANTS = 'classparticipants'
|
||||
ARG_CLASSROOMINVITATION = 'classroominvitation'
|
||||
ARG_CLASSROOMINVITATIONS = 'classroominvitations'
|
||||
@@ -805,6 +807,7 @@ class GamCLArgs():
|
||||
ARG_COURSE = 'course'
|
||||
ARG_COURSES = 'courses'
|
||||
ARG_COURSEANNOUNCEMENTS = 'courseannouncements'
|
||||
ARG_COURSECOUNTS = 'coursecounts'
|
||||
ARG_COURSEMATERIALS = 'coursematerials'
|
||||
ARG_COURSEPARTICIPANTS = 'courseparticipants'
|
||||
ARG_COURSESTUDENTGROUP = 'coursestudentgroup'
|
||||
@@ -1275,6 +1278,7 @@ class GamCLArgs():
|
||||
OB_MATTER_ITEM = 'MatterItem'
|
||||
OB_MATTER_ITEM_LIST = 'MatterItemList'
|
||||
OB_MEET_CONFERENCE_NAME = 'MeetConferenceName'
|
||||
OB_MEET_ID = 'MeetID'
|
||||
OB_MESSAGE_ID = 'MessageID'
|
||||
OB_MIMETYPE = 'MimeType'
|
||||
OB_MIMETYPE_LIST = 'MimeTypeList'
|
||||
|
||||
@@ -106,6 +106,7 @@ class GamEntity():
|
||||
CHROME_BROWSER_ENROLLMENT_TOKEN = 'cbet'
|
||||
CHROME_CHANNEL = 'chan'
|
||||
CHROME_DEVICE = 'chdv'
|
||||
CHROME_DEVICE_COUNT = 'chdc'
|
||||
CHROME_MODEL = 'chmo'
|
||||
CHROME_NETWORK_ID = 'chni'
|
||||
CHROME_NETWORK_NAME = 'chnn'
|
||||
@@ -473,6 +474,7 @@ class GamEntity():
|
||||
CHROME_BROWSER_ENROLLMENT_TOKEN: ['Chrome Browser Enrollment Tokens', 'Chrome Browser Enrollment Token'],
|
||||
CHROME_CHANNEL: ['Chrome Channels', 'Chrome Channel'],
|
||||
CHROME_DEVICE: ['Chrome Devices', 'Chrome Device'],
|
||||
CHROME_DEVICE_COUNT: ['Chrome Device Counts', 'Chrome Device Count'],
|
||||
CHROME_MODEL: ['Chrome Models', 'Chrome Model'],
|
||||
CHROME_NETWORK_ID: ['Chrome Network IDs', 'Chrome Network ID'],
|
||||
CHROME_NETWORK_NAME: ['Chrome Network Names', 'Chrome Network Name'],
|
||||
|
||||
@@ -355,6 +355,7 @@ LESS_THAN_1_SECOND = 'less than 1 second'
|
||||
LIST_CHROMEOS_INVALID_INPUT_PAGE_TOKEN_RETRY = 'List ChromeOSdevices Invalid Input: pageToken retry'
|
||||
LOGGING_INITIALIZATION_ERROR = 'Logging initialization error: {0}'
|
||||
LOOKING_UP_GOOGLE_UNIQUE_ID = 'Looking up Google Unique ID'
|
||||
MAP_PERMISSIONS_EMAIL_FILE_HEADERS_REQUIRED = '{0} <CSVFileInput> requires headers "sourceEmail" and "destinationEmail"'
|
||||
MARKED_AS = 'Marked as'
|
||||
MATCHED_THE_FOLLOWING = 'Matched the following'
|
||||
MATTER_NOT_OPEN = 'Matter needs to be open, current state is: {0}'
|
||||
|
||||
@@ -19,12 +19,11 @@
|
||||
"""YubiKey"""
|
||||
|
||||
import base64
|
||||
from datetime import datetime, timedelta
|
||||
from secrets import SystemRandom
|
||||
import string
|
||||
import sys
|
||||
|
||||
import arrow
|
||||
|
||||
from gam import mplock
|
||||
|
||||
from gam import systemErrorExit
|
||||
@@ -41,7 +40,6 @@ from ykman.piv import generate_self_signed_certificate, generate_chuid
|
||||
from yubikit.piv import DEFAULT_MANAGEMENT_KEY, \
|
||||
InvalidPinError, \
|
||||
KEY_TYPE, \
|
||||
MANAGEMENT_KEY_TYPE, \
|
||||
PIN_POLICY, \
|
||||
PivSession, \
|
||||
OBJECT_ID, \
|
||||
@@ -149,17 +147,17 @@ class YubiKey():
|
||||
piv.change_puk('12345678', new_puk)
|
||||
piv.change_pin('123456', new_pin)
|
||||
writeStdout(Msg.YUBIKEY_PIN_SET_TO.format(new_pin))
|
||||
piv.authenticate(MANAGEMENT_KEY_TYPE.TDES, DEFAULT_MANAGEMENT_KEY)
|
||||
piv.authenticate(piv.management_key_type, DEFAULT_MANAGEMENT_KEY)
|
||||
piv.verify_pin(new_pin)
|
||||
writeStdout(Msg.YUBIKEY_GENERATING_NONEXPORTABLE_PRIVATE_KEY)
|
||||
pubkey = piv.generate_key(SLOT.AUTHENTICATION,
|
||||
KEY_TYPE.RSA2048,
|
||||
PIN_POLICY.ALWAYS,
|
||||
TOUCH_POLICY.NEVER)
|
||||
now = arrow.utcnow()
|
||||
valid_to = now.shift(days=36500)
|
||||
now = datetime.utcnow()
|
||||
valid_to = now + timedelta(days=3650)
|
||||
subject = 'CN=GAM Created Key'
|
||||
piv.authenticate(MANAGEMENT_KEY_TYPE.TDES, DEFAULT_MANAGEMENT_KEY)
|
||||
piv.authenticate(piv.management_key_type, DEFAULT_MANAGEMENT_KEY)
|
||||
piv.verify_pin(new_pin)
|
||||
cert = generate_self_signed_certificate(piv,
|
||||
SLOT.AUTHENTICATION,
|
||||
|
||||
@@ -9,7 +9,7 @@ import { TOTP } from 'totp-generator';
|
||||
|
||||
async function screenshot(driver, filename) {
|
||||
// uncomment to save .png screenshots
|
||||
//await driver.saveScreenshot(filename);
|
||||
await driver.saveScreenshot(filename);
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
@@ -1524,9 +1524,7 @@ gam config csv_input_row_filter "scopeType:regex:ORG_UNIT" redirect stdout ./Upd
|
||||
```
|
||||
|
||||
## Copy non-system admin roles from a source workspace to a target workspace
|
||||
This requires GAM version 7.18.01 or higher.
|
||||
|
||||
In the source workspace to the following:
|
||||
In the source workspace do the following:
|
||||
```
|
||||
gam redirect csv ./SourceNonSystemRoles.csv print adminroles privileges nosystemroles formatjson quotechar "'"
|
||||
```
|
||||
|
||||
@@ -394,9 +394,9 @@ gam show projects [[admin] <EmailAddress>] [all|<ProjectIDEntity>]
|
||||
* `<EmailAddress>` - A Google Workspace admin/GCP project manager; if omitted, you will be prompted for the address
|
||||
|
||||
Use these options to select projects.
|
||||
* `all` - All projects accessible by the administrator; this is the default
|
||||
* `all` - All projects accessible by the administrator
|
||||
* `current` - The project referenced in `client_secrets.json`
|
||||
* `gam` - Projects accessible by the administrator that were created by Gam, i.e, their project ID begins with `gam-project-`
|
||||
* `gam` - Projects accessible by the administrator that were created by Gam, i.e, their project ID begins with `gam-project-`; this is the default
|
||||
* `<ProjectID>` - A Google API project ID
|
||||
* `filter <String>` - A filter to select projects accessible by the administrator; see the API documentation
|
||||
* `states all|active|deleterequested` - Limit display to projects based on state; the default is `active`
|
||||
@@ -412,9 +412,9 @@ gam print projects [[admin] <EmailAddress>] [all|<ProjectIDEntity>] [todrive <To
|
||||
* `<EmailAddress>` - A Google Workspace admin/GCP project manager; if omitted, you will be prompted for the address
|
||||
|
||||
Use these options to select projects.
|
||||
* `all` - All projects accessible by the administrator; this is the default
|
||||
* `all` - All projects accessible by the administrator
|
||||
* `current` - The project referenced in `client_secrets.json`
|
||||
* `gam` - Projects accessible by the administrator that were created by Gam, i.e, their project ID begins with `gam-project-`
|
||||
* `gam` - Projects accessible by the administrator that were created by Gam, i.e, their project ID begins with `gam-project-`; this is the default
|
||||
* `<ProjectID>` - A Google API project ID
|
||||
* `filter <String>` - A filter to select projects accessible by the administrator; see the API documentation
|
||||
* `states all|active|deleterequested` - Limit display to projects based on state; the default is `active`
|
||||
|
||||
@@ -409,6 +409,8 @@
|
||||
<MatterItem> ::= <UniqueID>|<String>
|
||||
<MatterState> ::= open|closed|deleted
|
||||
<MeetConferenceName> ::= conferenceRecords/<String>
|
||||
<MeetID> ::= <String>
|
||||
Must match this Python Regular Expression: [a-z]{3}-[a-z]{4}-[a-z]{3}
|
||||
<MeetSpaceName> ::= spaces/<String> | <String>
|
||||
<MessageContent> ::=
|
||||
(message|textmessage|htmlmessage <String>)|
|
||||
|
||||
@@ -9,8 +9,6 @@
|
||||
|
||||
|
||||
## Introduction
|
||||
These features were added in version 7.18.00.
|
||||
|
||||
To use these commands you add the 'Business Account Management API' to your project and update client authorization.
|
||||
```
|
||||
gam update project
|
||||
|
||||
@@ -78,6 +78,8 @@ Client access works when accessing Resource calendars.
|
||||
<CSVkmdSelector> | <CSVDataSelector>
|
||||
See: https://github.com/GAM-team/GAM/wiki/Collections-of-Items
|
||||
<iCalUID> ::= <String>
|
||||
<MeetID> ::= <String>
|
||||
Must match this Python Regular Expression: [a-z]{3}-[a-z]{4}-[a-z]{3}
|
||||
|
||||
<EventAttachmentsSubfieldName> ::=
|
||||
attachments.fileid|
|
||||
@@ -150,7 +152,8 @@ Client access works when accessing Resource calendars.
|
||||
endtimeunspecified|
|
||||
extendedproperties|
|
||||
eventtype|
|
||||
<EventFocusTimePropertiesSubfieldName>
|
||||
focustimeproperties|
|
||||
<EventFocusTimePropertiesSubfieldName>|
|
||||
gadget|
|
||||
guestscaninviteothers|
|
||||
guestscanmodify|
|
||||
@@ -164,7 +167,8 @@ Client access works when accessing Resource calendars.
|
||||
organizer|
|
||||
<EventOrganizerSubfieldName>|
|
||||
originalstart|originalstarttime|
|
||||
<EventOutOfOfficePropertiesSubfieldName>
|
||||
outofofficeproperties|
|
||||
<EventOutOfOfficePropertiesSubfieldName>|
|
||||
privatecopy|
|
||||
recurrence|
|
||||
recurringeventid|
|
||||
@@ -254,6 +258,7 @@ Client access works when accessing Resource calendars.
|
||||
(birthday <Date>)|
|
||||
(color <EventColorName>)|
|
||||
(colorindex|colorid <EventColorIndex>)|
|
||||
(conferencedata meet <MeetID>)|
|
||||
(description <String>)|
|
||||
(end|endtime (allday <Date>)|<Time>)|
|
||||
(guestscaninviteothers <Boolean>)|
|
||||
@@ -261,7 +266,7 @@ Client access works when accessing Resource calendars.
|
||||
(guestscanmodify <Boolean>)|
|
||||
(guestscanseeotherguests <Boolean>)|
|
||||
guestscantseeotherguests|
|
||||
hangoutsmeet|
|
||||
googlemeet|hangoutsmeet|
|
||||
<JSONData>|
|
||||
(jsonattendees [charset <Charset>] <String>)|
|
||||
(jsonattendees file <FileName> [charset <Charset>])|
|
||||
@@ -302,7 +307,7 @@ The following attributes are equivalent:
|
||||
<EventAttribute>|
|
||||
clearattachments|
|
||||
clearattendees|
|
||||
clearhangoutsmeet|
|
||||
cleargooglemeet|clearhangoutsmeet|
|
||||
(clearprivateproperty <PropertyKey>)|
|
||||
clearresources|
|
||||
(clearsharedproperty <PropertyKey>)|
|
||||
|
||||
@@ -27,13 +27,16 @@ Client access works when accessing Resource calendars.
|
||||
See: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
|
||||
|
||||
<CalendarSettings> ::=
|
||||
(autoacceptinvitations [<Boolean>])|
|
||||
(description <String>)|
|
||||
(location <String>)|
|
||||
(summary <String>)|
|
||||
(timezone <TimeZone>)
|
||||
|
||||
<CalendarSettingsField> ::=
|
||||
autoacceptinvitations|3
|
||||
conferenceproperties|
|
||||
dataowner|
|
||||
description|
|
||||
id|
|
||||
location|
|
||||
|
||||
65
wiki/Chrome-Device-Counts.md
Normal file
65
wiki/Chrome-Device-Counts.md
Normal file
@@ -0,0 +1,65 @@
|
||||
# Chrome Device Counts
|
||||
- [API documentation](#api-documentation)
|
||||
- [Notes](#notes)
|
||||
- [Definitions](#definitions)
|
||||
- [Count titles](#count-titles)
|
||||
- [Display Chrome device counts](#display-chrome-device-counts)
|
||||
|
||||
## API documentation
|
||||
* [Chrome Management API - Count Active Devices](https://developers.google.com/chrome/management/reference/rest/v1/customers.reports/countActiveDevices)
|
||||
* [Chrome Management API - Count Devices per Boot Type](https://developers.google.com/chrome/management/reference/rest/v1/customers.reports/countDevicesPerBootType)
|
||||
* [Chrome Management API - Count Devices per Release Channel](https://developers.google.com/chrome/management/reference/rest/v1/customers.reports/countDevicesPerReleaseChannel)
|
||||
|
||||
## Notes
|
||||
To use these features you must add the `Chrome Management API` to your project and authorize
|
||||
the appropriate scope: `Chrome Management API - read only`.
|
||||
```
|
||||
gam update project
|
||||
gam oauth create
|
||||
```
|
||||
|
||||
## Definitions
|
||||
```
|
||||
<Date> ::=
|
||||
<Year>-<Month>-<Day> |
|
||||
(+|-)<Number>(d|w|y) |
|
||||
today
|
||||
```
|
||||
|
||||
## Count titles
|
||||
`active` - `sevenDaysCount,thirtyDaysCount`
|
||||
`perboottype` - `devBootTypeCount,unreportedBootTypeCount,verifiedBootTypeCount`
|
||||
`perreleasechanneel` - `betaChannelCount,canaryChannelCount,devChannelCount,ltcChannelCount,ltsChannelCount,stableChannelCount,unreportedChannelCount,unsupportedChannelCount`
|
||||
|
||||
## Display Chrome device counts
|
||||
```
|
||||
gam show chromedevicecounts
|
||||
(mode all|active|perboottype|perreleasechannel)*
|
||||
[date <Date>]
|
||||
[formatjson]
|
||||
```
|
||||
By default, `mode all` is selected
|
||||
|
||||
By default, `date today` is selected.
|
||||
|
||||
By default, Gam displays the information as an indented list of keys and values.
|
||||
* `formatjson` - Display the fields in JSON format.
|
||||
|
||||
```
|
||||
gam print chromedevicecounts [todrive <ToDriveAttribute>*]
|
||||
(mode all|active|perboottype|perreleasechannel)*
|
||||
[date <Date>]
|
||||
[formatjson [quotechar <Character>]]
|
||||
```
|
||||
By default, `mode all` is selected
|
||||
|
||||
By default, `date today` is selected.
|
||||
|
||||
By default, Gam displays the information as columns of fields; the following option causes the output to be in JSON format,
|
||||
* `formatjson` - Display the fields in JSON format.
|
||||
|
||||
By default, when writing CSV files, Gam uses a quote character of double quote `"`. The quote character is used to enclose columns that contain
|
||||
the quote character itself, the column delimiter (comma by default) and new-line characters. Any quote characters within the column are doubled.
|
||||
When using the `formatjson` option, double quotes are used extensively in the data resulting in hard to read/process output.
|
||||
The `quotechar <Character>` option allows you to choose an alternate quote character, single quote for instance, that makes for readable/processable output.
|
||||
`quotechar` defaults to `gam.cfg/csv_output_quote_char`. When uploading CSV files to Google, double quote `"` should be used.
|
||||
@@ -1,9 +1,9 @@
|
||||
# Chrome Installed Apps Counts
|
||||
# Chrome Installed Apps
|
||||
- [API documentation](#api-documentation)
|
||||
- [Definitions](#definitions)
|
||||
- [Quoting rules](#quoting-rules)
|
||||
- [Display Chrome installed app details](#display-chrome-installed-app-details)
|
||||
- [Display Chrome installed apps counts](#display-chrome-installed-apps-counts)
|
||||
- [Display Chrome installed apps](#display-chrome-installed-apps)
|
||||
- [Display Chrome devices with a specific installed application](#display-chrome-devices-with-a-specific-installed-application)
|
||||
|
||||
## API documentation
|
||||
@@ -54,7 +54,7 @@ gam info chromeapp android|chrome|web <AppID>
|
||||
By default, Gam displays the information as an indented list of keys and values.
|
||||
* `formatjson` - Display the fields in JSON format.
|
||||
|
||||
## Display Chrome installed apps counts
|
||||
## Display Chrome installed apps
|
||||
```
|
||||
gam show chromeapps
|
||||
[(ou <OrgUnitItem>)|(ou_and_children <OrgUnitItem>)|
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
- [Create a Chrome policy image](#create-a-chrome-policy-image)
|
||||
- [Update Chrome policy](#update-chrome-policy)
|
||||
- [Delete Chrome policy](#delete-chrome-policy)
|
||||
- [Delete Chrome app](#delete-chrome-app)
|
||||
- [Display Chrome policies](#display-chrome-policies)
|
||||
- [Copy simple policies set directly in one OU to another OU](#copy-simple-policies-set-directly-in-one-ou-to-another-ou)
|
||||
- [Copy simple and complex policies set directly in one OU to another OU](#copy-simple-and-complex-policies-set-directly-in-one-ou-to-another-ou)
|
||||
@@ -228,6 +229,17 @@ Restrict students from accessing Blocked URLs.
|
||||
```
|
||||
gam update chromepolicy chrome.users.UrlBlocking urlBlocklist "https://socialmedia.com,https://videowebsite.com" orgunit "/Students"
|
||||
```
|
||||
The Policy API and GAM have no ability to edit lists, you have to supply the complete list.
|
||||
```
|
||||
# Get the current policy
|
||||
gam redirect stdout ./urlBlockList.json show chromepolicies filter chrome.users.UrlBlocking orgunit "/Students" formatjson
|
||||
|
||||
# Edit urlBlockList.json to add the new URL(s)
|
||||
{"additionalTargetKeys": [], "direct": true, "fields": [{"name": "urlBlocklist", "value": "https://socialmedia.com,https://videowebsite.com,https://nogo.com"}, {"name": "chromeInternalUrlsBlocked", "value": false}], "name": "chrome.users.UrlBlocking", "orgUnitPath": "/Students", "parentOrgUnitPath": "/"}
|
||||
|
||||
# Update the policy
|
||||
gam update chromepolicies chrome.users.UrlBlocking json file urlBlockList.json orgunit "/Students"
|
||||
```
|
||||
For managed browsers, specify that users can only sign into managed accounts belonging to company/school domains.
|
||||
```
|
||||
gam update chromepolicy chrome.users.SecondaryGoogleAccountSignin allowedDomainsForApps company.com,company.net orgunit "/Managed Browsers"
|
||||
@@ -243,7 +255,6 @@ Allowlist the Google Translate extension for the Students OrgUnit
|
||||
```
|
||||
gam update chromepolicy chrome.users.apps.InstallType appInstallType ALLOWED app_id chrome:aapbdbdomjkkjkaonfhkkikfgjllcleb ou "/Students"
|
||||
```
|
||||
|
||||
## Delete Chrome policy
|
||||
You can delete a policy for all devices/users within an OU, users with a group or for a specific printer or application within an OU.
|
||||
|
||||
@@ -255,6 +266,13 @@ gam delete chromepolicy
|
||||
((ou|orgunit <OrgUnitItem>)|(group <GroupItem>))
|
||||
[(printerid <PrinterID>)|(appid <AppID>)]
|
||||
```
|
||||
|
||||
## Delete Chrome app
|
||||
You can delete an app, i.e., explicitly remove it from management. `<OrgUnitItem>` must specify where the app was added for management.
|
||||
```
|
||||
gam delete chromepolicy chrome.users.apps.InstallType ou|orgunit <OrgUnitItem> appid <AppID>
|
||||
```
|
||||
|
||||
## Display Chrome policies
|
||||
You can display policies for all devices/users within an OU, users with a group or for a specific printer or application within an OU.
|
||||
|
||||
|
||||
@@ -10,8 +10,6 @@
|
||||
- [Display Chrome Profile commands](#display-chrome-profile-commands)
|
||||
|
||||
## Introduction
|
||||
These features were added in version 7.01.00.
|
||||
|
||||
To use these commands you must update your client authorization.
|
||||
```
|
||||
gam oauth create
|
||||
|
||||
@@ -410,7 +410,7 @@ gam update ou csvkmd cros.csv keyfield OU datafield deviceId add croscsvdata dev
|
||||
gam <CrOSTypeEntity> update action <CrOSAction> [acknowledge_device_touch_requirement]
|
||||
[actionbatchsize <Integer>]
|
||||
```
|
||||
As of GAM version `6.67.00`, the new API function `batchChangeStatus` replaces the old API function `action`; ChromeOS devices are now processed in batches.
|
||||
ChromeOS devices are now processed in batches.
|
||||
The batch size defaults to 10, the `actionbatchsize <Integer>` option can be used to set a batch size between 10 and 250.
|
||||
|
||||
As deprovisioning ChromeOS devices is not reversible, you must enter `acknowledge_device_touch_requirement`
|
||||
@@ -711,7 +711,9 @@ To retrieve the count with `showitemcountonly`:
|
||||
Linux/MacOS
|
||||
count=$(gam print cros query "sync:..2020-01-01" showitemcountonly)
|
||||
Windows PowerShell
|
||||
count = & gam print cros query "sync:..2020-01-01" showitemcountonly
|
||||
$count = & gam print cros query "sync:..2020-01-01" showitemcountonly
|
||||
Windows Command Prompt
|
||||
for /f "delims=" %a in ('gam print cros query "sync:..2020-01-01" showitemcountonly') do set count=%a
|
||||
```
|
||||
|
||||
## Print ChromeOS device activity
|
||||
|
||||
@@ -379,7 +379,7 @@ Drive files with `shareMode` `Each student will get a copy` don't seem to be abl
|
||||
|
||||
## Delete courses
|
||||
Classes can only be deleted when they are in the ARCHIVED state; to delete a class, you can update its state to ARCHIVED
|
||||
and then delete it or you can specify that it be archived as parot of the delete command.
|
||||
and then delete it or you can specify that it be archived as part of the delete command.
|
||||
```
|
||||
gam delete course <CourseID> [archived]
|
||||
gam delete courses <CourseEntity> [archived]
|
||||
@@ -514,7 +514,9 @@ To retrieve the count with `showitemcountonly`:
|
||||
Linux/MacOS
|
||||
count=$(gam print courses states active showitemcountonly)
|
||||
Windows PowerShell
|
||||
count = & gam print courses states active showitemcountonly
|
||||
$count = & gam print courses states active showitemcountonly
|
||||
Windows Command Prompt
|
||||
for /f "delims=" %a in ('gam print courses states active showitemcountonly') do set count=%a
|
||||
```
|
||||
|
||||
## Display course announcements
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
- [Bulk membership changes](#bulk-membership-changes)
|
||||
- [Display course membership](#display-course-membership)
|
||||
- [Display course membership counts](#display-course-membership-counts)
|
||||
- [Display course counts for teachers-students](#display-course-counts-for-teachers-students)
|
||||
|
||||
## API documentation
|
||||
* [Google Classroom API](https://developers.google.com/classroom/reference/rest)
|
||||
@@ -163,5 +164,50 @@ To retrieve the count with `showitemcountonly`:
|
||||
Linux/MacOS
|
||||
count=$(gam print course-participants teacher asmith states active show students showitemcountonly)
|
||||
Windows PowerShell
|
||||
count = & gam print course-participants teacher asmith states active show students showitemcountonly
|
||||
$count = & gam print course-participants teacher asmith states active show students showitemcountonly
|
||||
Windows Command Prompt
|
||||
for /f "delims=" %a in ('gam print course-participants teacher asmith states active show students showitemcountonly') do set count=%a
|
||||
```
|
||||
|
||||
## Display course counts for teachers-students
|
||||
You can get a count of the number of courses in which a teacher or student is a participant.
|
||||
```
|
||||
gam print course-counts students|teachers [todrive <ToDriveAttribute>*]
|
||||
(course|class <CourseEntity>)*|([teacher <UserItem>] [student <UserItem>] [states <CourseStateList>])
|
||||
[mincount <Integer>]
|
||||
[formatjson [quotechar <Character>]]
|
||||
```
|
||||
By default, the `print course-counts` command displays participant counts about all courses.
|
||||
|
||||
To get participant counts for a specific set of courses, use the following option; it can be repeated to select multiple courses.
|
||||
* `(course|class <CourseID>)*` - Display courses with the specified `<CourseID>`.
|
||||
|
||||
To get participant counts for courses based on their having a particular participant, use the following options. Both options can be specified.
|
||||
* `teacher <UserItem>` - Display courses with the specified teacher.
|
||||
* `student <UserItem>` - Display courses with the specified student.
|
||||
|
||||
To get participant counts for courses based on their state, use the following option. This option can be combined with the `teacher` and `student` options.
|
||||
By default, all course states are selected.
|
||||
* `states <CourseStateList>` - Display courses with any of the specified states.
|
||||
|
||||
By default, all count values are displayed, use `mincount <Integer>` to limit the display to those counts
|
||||
greater that or equal to the specified `<Integer>`.
|
||||
|
||||
By default, Gam displays the counts as columns of fields; the following option causes the output to be in JSON format,
|
||||
* `formatjson` - Display the fields in JSON format.
|
||||
|
||||
By default, when writing CSV files, Gam uses a quote character of double quote `"`. The quote character is used to enclose columns that contain
|
||||
the quote character itself, the column delimiter (comma by default) and new-line characters. Any quote characters within the column are doubled.
|
||||
When using the `formatjson` option, double quotes are used extensively in the data resulting in hard to read/process output.
|
||||
The `quotechar <Character>` option allows you to choose an alternate quote character, single quote for instance, that makes for readable/processable output.
|
||||
`quotechar` defaults to `gam.cfg/csv_output_quote_char`. When uploading CSV files to Google, double quote `"` should be used.
|
||||
|
||||
### Example
|
||||
For teachers in all active courses, print the number of classes for which they are a participant.
|
||||
```
|
||||
gam print coursecounts teachers states active
|
||||
```
|
||||
For teachers in all active courses, print the number of classes (if it is >= 5) for which they are a participant.
|
||||
```
|
||||
gam print coursecounts teachers states active mincount 5
|
||||
```
|
||||
|
||||
@@ -269,5 +269,7 @@ To retrieve the count with `showitemcountonly`:
|
||||
Linux/MacOS
|
||||
count=$(gam print course-participants teacher asmith states active show students showitemcountonly)
|
||||
Windows PowerShell
|
||||
count = & gam print course-participants teacher asmith states active show students showitemcountonly
|
||||
$count = & gam print course-participants teacher asmith states active show students showitemcountonly
|
||||
Windows Command Prompt
|
||||
for /f "delims=" %a in ('gam print course-participants teacher asmith states active show students showitemcountonly') do set count=%a
|
||||
```
|
||||
|
||||
@@ -272,7 +272,9 @@ To retrieve the count with `showitemcountonly`:
|
||||
Linux/MacOS
|
||||
count=$(gam print devices queries "'model:Mac'" showitemcountonly)
|
||||
Windows PowerShell
|
||||
count = & gam print devices queries "'model:Mac'" showitemcountonly
|
||||
$count = & gam print devices queries "'model:Mac'" showitemcountonly
|
||||
Windows Command Prompt
|
||||
for /f "delims=" %a in ('gam print devices queries "'model:Mac'" showitemcountonly') do set count=%a
|
||||
```
|
||||
|
||||
## Approve or block device users
|
||||
@@ -363,7 +365,9 @@ To retrieve the count with `showitemcountonly`:
|
||||
Linux/MacOS
|
||||
count=$(gam print deviceusers queries "'model:Mac'" showitemcountonly)
|
||||
Windows PowerShell
|
||||
count = & gam print deviceusers queries "'model:Mac'" showitemcountonly
|
||||
$count = & gam print deviceusers queries "'model:Mac'" showitemcountonly
|
||||
Windows Command Prompt
|
||||
for /f "delims=" %a in ('gam print deviceusers queries "'model:Mac'" showitemcountonly') do set count=%a
|
||||
```
|
||||
|
||||
|
||||
|
||||
@@ -458,5 +458,7 @@ To retrieve the count with `showitemcountonly`:
|
||||
Linux/MacOS
|
||||
count=$(gam print cigroups showitemcountonly)
|
||||
Windows PowerShell
|
||||
count = & gam print cidgroups showitemcountonly
|
||||
$count = & gam print cigroups showitemcountonly
|
||||
Windows Command Prompt
|
||||
for /f "delims=" %a in ('gam print cigroups showitemcountonly') do set count=%a
|
||||
```
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
- [Windows PowerShell](#windows-powershell)
|
||||
- [List quoting rules](#list-quoting-rules)
|
||||
- [Queries example](#queries-example)
|
||||
- [Capture command output](#capture-command-output)
|
||||
|
||||
## Linux and MacOS
|
||||
|
||||
@@ -79,3 +80,25 @@ gam print users queries "\"orgUnitPath='/Students/Lower School/2027'\",\"orgUnit
|
||||
```
|
||||
gam print users queries "`"orgUnitPath=\'/Students/Lower\ School/2027\'`",`"orgUnitPath=\'/Students/Lower\ School/2028\'`""
|
||||
```
|
||||
|
||||
## Capture command output
|
||||
|
||||
To retrieve an item count with `showitemcountonly`:
|
||||
```
|
||||
Linux/MacOS
|
||||
count=$(gam print users query "orgUnitPath='/Students/Middle School'" showitemcountonly)
|
||||
Windows PowerShell
|
||||
$count = & gam print users query "orgUnitPath='/Students/Middle School'" showitemcountonly
|
||||
Windows Command Prompt
|
||||
for /f "delims=" %a in ('gam print users query "orgUnitPath='/Students/Middle School'" showitemcountonly') do set count=%a
|
||||
```
|
||||
|
||||
To retrieve a File/Shared Drive ID with `returnidonly`:
|
||||
```
|
||||
Linux/MacOS
|
||||
itemId=$(gam user user@domain.com create shareddrive|drivefile ... returnidonly)
|
||||
Windows PowerShell
|
||||
$itemId = & gam user user@domain.com create shareddrive|drivefile ... returnidonly
|
||||
Windows Command Prompt
|
||||
for /f "delims=" %a in ('gam user user@domain.com create shareddrive|drivefile ... returnidonly') do set itemId=%a
|
||||
```
|
||||
|
||||
@@ -13,10 +13,6 @@
|
||||
- [CAA Region Codes](#caa-region-codes)
|
||||
|
||||
## Notes
|
||||
This Wiki page was built directly from Jay Lee's Wiki page; my sincere thanks for his efforts.
|
||||
|
||||
GAM 6.20.00 and newer can create and manage access levels which can be assigned to Workspace services for your users.
|
||||
|
||||
To use these features you must update your project.
|
||||
```
|
||||
gam update project
|
||||
|
||||
@@ -29,11 +29,11 @@
|
||||
<UserGoogleDoc> ::=
|
||||
<EmailAddress> <DriveFileIDEntity>|<DriveFileNameEntity>|(<SharedDriveEntity> <SharedDriveFileNameEntity>)
|
||||
|
||||
<NoteContent> ::=
|
||||
((<String>)|
|
||||
(file <FileName> [charset <Charset>])|
|
||||
(gdoc <UserGoogleDoc>)|
|
||||
(gcsdoc <StorageBucketObjectName>))
|
||||
<ContactNoteContent> ::=
|
||||
(<String>)|
|
||||
(file|textfile <FileName> [charset <Charset>])|
|
||||
(gdoc <UserGoogleDoc>)|
|
||||
(gcsdoc <StorageBucketObjectName>)
|
||||
|
||||
<Date> ::=
|
||||
<Year>-<Month>-<Day> |
|
||||
@@ -79,7 +79,7 @@
|
||||
(mileage <String>)|
|
||||
(name <String>)|
|
||||
(nickname <String>)|
|
||||
(note <NoteContent>)|
|
||||
(note <ContactNoteContent>)|
|
||||
(occupation <String>)|
|
||||
(prefix <String>)|
|
||||
(priority low|normal|high)
|
||||
|
||||
@@ -60,6 +60,15 @@ Display the number of domains.
|
||||
gam print|show domains
|
||||
showitemcountonly
|
||||
```
|
||||
To retrieve the count with `showitemcountonly`:
|
||||
```
|
||||
Linux/MacOS
|
||||
count=$(gam print domains showitemcountonly)
|
||||
Windows PowerShell
|
||||
$count = & gam print domains showitemcountonly
|
||||
Windows Command Prompt
|
||||
for /f "delims=" %a in ('gam print domains showitemcountonly') do set count=%a
|
||||
```
|
||||
|
||||
## Create and delete domain aliases
|
||||
```
|
||||
@@ -94,3 +103,12 @@ Display the number of domain aliases.
|
||||
gam print|show domainaliases|aliasdomains
|
||||
showitemcountonly
|
||||
```
|
||||
To retrieve the count with `showitemcountonly`:
|
||||
```
|
||||
Linux/MacOS
|
||||
count=$(gam print domainaliases showitemcountonly)
|
||||
Windows PowerShell
|
||||
$count = & gam print domainaliases showitemcountonly
|
||||
Windows Command Prompt
|
||||
for /f "delims=" %a in ('gam print domainaliases showitemcountonly') do set count=%a
|
||||
```
|
||||
|
||||
@@ -13,4 +13,4 @@ _Note: Chromebooks / Chrome OS devices should install GAM7 using [these instruct
|
||||
sudo apt update
|
||||
sudo apt install curl python3
|
||||
```
|
||||
7. [How to Install Advanced GAM](How-to-Install-Advanced-GAM)
|
||||
7. [How to Install GAM7](How-to-Install-GAM7)
|
||||
|
||||
@@ -7,7 +7,7 @@ Chrome OS devices that [support Linux apps](https://support.google.com/chromeboo
|
||||
sudo apt update
|
||||
sudo apt install xz-utils
|
||||
```
|
||||
3. [How to Install Advanced GAM](How-to-Install-Advanced-GAM)
|
||||
3. [How to Install GAM7](How-to-Install-GAM7)
|
||||
|
||||
# Google cloud shell
|
||||
|
||||
|
||||
@@ -10,6 +10,174 @@ Add the `-s` option to the end of the above commands to suppress creating the `g
|
||||
|
||||
See [Downloads-Installs-GAM7](https://github.com/GAM-team/GAM/wiki/Downloads-Installs) for Windows or other options, including manual installation
|
||||
|
||||
### 7.30.03
|
||||
|
||||
Updated `gam report <ActivityApplicationName>` to reflect the changes described here:
|
||||
* See: https://workspaceupdates.googleblog.com/2025/12/google-workspace-audit-log-api.html
|
||||
|
||||
Added option `resourcedetailsfilter <String>` to `gam report <ActivityApplicationName>` described here:
|
||||
* See: https://developers.google.com/workspace/admin/reports/reference/rest/v1/activities/list#query-parameters
|
||||
|
||||
For `gam <UserTypeEntity> print <Objects>`, expanded the list of `<Objects>` covered by `gam.cfg csv_output_users_audit = True`.
|
||||
|
||||
### 7.30.02
|
||||
|
||||
Added option `conferencedata meet <MeetID>` to `<EventAttribute>` that allows specifying
|
||||
a reference to an existing Google Meet when creating/updating a calendar event.
|
||||
|
||||
Upgraded to Python 3.14.2.
|
||||
|
||||
### 7.30.01
|
||||
|
||||
Fixed bug introduced in 7.30.00 that caused errors when reading CSV files.
|
||||
|
||||
Added the following options to `gam <UserTypeEntity> create focustime|outofoffice`:
|
||||
```
|
||||
((date yyyy-mm-dd)|
|
||||
(range yyyy-mm-dd yyyy-mm-dd)|
|
||||
(daily yyyy-mm-dd N)|
|
||||
(weekly yyyy-mm-dd N))
|
||||
```
|
||||
|
||||
Added the following options to `gam <UserTypeEntity> create focustime|outofoffice|workinglocation`:
|
||||
```
|
||||
noreminders|(reminder email|popup <Number>)+
|
||||
```
|
||||
|
||||
### 7.30.00
|
||||
|
||||
Added `input_dir` directory variable to `gam.cfg` that is used to select a directory for reading files with non-absolute file names.
|
||||
The default is an empty string that matches the current behavior where these files are read from the current working directory.
|
||||
This will be most useful in multiple domain situations where each domain will have distinct `drive_dir` and `input_dir` values.
|
||||
|
||||
Added support for the new resource calendar setting `autoAcceptInvitations`.
|
||||
|
||||
### 7.29.04
|
||||
|
||||
Updated `gam delete chromepolicy chrome.users.apps.InstallType ou <OrgUnitItem> appid <AppID>`
|
||||
to allow deleting an app, i.e., explicitly remove it from management. `<OrgUnitItem>` must specify where it was added for management.
|
||||
|
||||
### 7.29.03
|
||||
|
||||
Remove debugging message from `gam <UserTypeEntity> move drivefile <DriveFileEntity>`.
|
||||
|
||||
### 7.29.02
|
||||
|
||||
Fixed bug in `gam <UserTypeEntity> move drivefile <DriveFileEntity>` where the following options
|
||||
were only applied to top level files or folders re-created in the destination. Now, domain
|
||||
and email address mappings apply to all moved files/folders.
|
||||
```
|
||||
excludepermissionsfromdomains <DomainNameList>
|
||||
includepermissionsfromdomains <DomainNameList>
|
||||
mappermissionsdomain <DomainName> <DomainName>
|
||||
mappermissionsemail <EmailAddress> <EmailAddress>
|
||||
mappermissionsemailfile <CSVFileInput> endcsv
|
||||
```
|
||||
|
||||
Upgraded to Python 3.14.1.
|
||||
|
||||
### 7.29.01
|
||||
|
||||
Added option `oneitemperrow` to `gam <UserTypeEntity> print calendars ... permissions` to have each of a
|
||||
calendar's permissions displayed on a separate row with all of the other calendar fields.
|
||||
|
||||
Updated `gam yubikey reset_piv` to handle YubiKey firmware updates that caused an error.
|
||||
|
||||
### 7.29.00
|
||||
|
||||
Added options `mappermissionsemail <EmailAddress> <EmailAddress>` and ` mappermissionsemailfile <CSVFileInput> endcsv`
|
||||
to these commands:
|
||||
```
|
||||
gam [<UserTypeEntity>] copy shareddriveacls <SharedDriveEntity> to <SharedDriveEntity>
|
||||
gam [<UserTypeEntity>] sync shareddriveacls <SharedDriveEntity> with <SharedDriveEntity>
|
||||
gam <UserTypeEntity> copy drivefile <DriveFileEntity>
|
||||
gam <UserTypeEntity> move drivefile <DriveFileEntity>
|
||||
```
|
||||
When `mappermissionsemail <EmailAddress> <EmailAddress>` is specifed, an ACL that references the first `<EmailAddress>`
|
||||
in the source will be modified to reference the second `<EmailAddress>` in the destination.
|
||||
|
||||
Bulk permission email address mapping can be specified with `mappermissionsemailfile <CSVFileInput> endcsv`.
|
||||
`<CSVFileInput>` must include these columns: `sourceEmail` and `destinationEmail`.
|
||||
|
||||
These options will be most useful with inter-workspace Shared Drive copies and moves.
|
||||
|
||||
### 7.28.13
|
||||
|
||||
Added option `addcsvdata <FieldName> <String>` to `gam <UserTypeEntity> print messages`
|
||||
that adds additional columns of data to the CSV file output.
|
||||
|
||||
### 7.28.12
|
||||
|
||||
Updated `gam delete project` to handle the following error:
|
||||
```
|
||||
ERROR: 400: failedPrecondition - Project not active
|
||||
```
|
||||
|
||||
### 7.28.11
|
||||
|
||||
Removed all options/fields referencing inheritance from `gam create|update|info|print org` as this option/field is deprecated.
|
||||
|
||||
### 7.28.10
|
||||
|
||||
Added a command `gam print course-counts` that dsplays the count of the number of courses in which a teacher or student is a participant.
|
||||
|
||||
* See: https://github.com/GAM-team/GAM/wiki/Classroom-Membership#display-course-counts-for-teachers-students
|
||||
|
||||
### 7.28.09
|
||||
|
||||
Fixed bug in `gam print cigroups ... descriptionmatchpattern [not] <REMatchPattern>` that caused a trap.
|
||||
|
||||
### 7.28.08
|
||||
|
||||
Updated `gam <UserTypeEntity> print|show chatmessages` to cache the sender UID to email address
|
||||
map so that each sender UID only has to be looked up once; this improves performance.
|
||||
|
||||
### 7.28.07
|
||||
|
||||
Fixed bug in `gam report users ... aggregatebydate|aggregatebyuser` where `accounts:used_quota_in_percentage` was incorrectly displayed.
|
||||
|
||||
### 7.28.06
|
||||
|
||||
Updated `gam <UserTypeEntity> info|print|show calendars` and
|
||||
`gam calendars <CalendarEntity> print|show settings` to display the
|
||||
new `dataOwner` field as described under `Additional details` below.
|
||||
|
||||
* See: https://workspaceupdates.googleblog.com/2025/11/secondary-calendar-management-with-dedicated-owners.html
|
||||
|
||||
### 7.28.04
|
||||
|
||||
Updated commands that display Chrome device counts to display the date in the output.
|
||||
|
||||
* See: https://github.com/GAM-team/GAM/wiki/Chrome-Device-Counts
|
||||
|
||||
### 7.28.03
|
||||
|
||||
Improved commands to display Chrome device counts.
|
||||
|
||||
* See: https://github.com/GAM-team/GAM/wiki/Chrome-Device-Counts
|
||||
|
||||
### 7.28.02
|
||||
|
||||
Added commands to display Chrome device counts.
|
||||
|
||||
* See: https://github.com/GAM-team/GAM/wiki/Chrome-Device-Counts
|
||||
|
||||
### 7.28.01
|
||||
|
||||
Updated `gam <UserTypeEntity> show fileinfo <DriveFileEntity>` to display `displayName` as the key field
|
||||
of a `permission` not `deleted`.
|
||||
|
||||
### 7.28.00
|
||||
|
||||
Added option `addcsvdata <FieldName> <String>` to `gam report [usage] customers|users`
|
||||
that adds additional columns of data to the CSV file output. This will be most useful
|
||||
when reading a CSV of user information and you want to include some of the user information,
|
||||
e.g., orgUnitPath, in the output.
|
||||
```
|
||||
gam redirect csv ./Users.csv print users fields ou
|
||||
gam redirect csv ./UserStorageInfo.csv multiprocess csv Users.csv gam report users user "~primaryEmail" parameters accounts:drive_used_quota_in_mb,accounts:gmail_used_quota_in_mb,accounts:gplus_photos_used_quota_in_mb,accounts:total_quota_in_mb,accounts:used_quota_in_mb,accounts:used_quota_in_percentage addcsvdata orgUnitPath "~orgUnitPath"
|
||||
```
|
||||
|
||||
### 7.27.05
|
||||
|
||||
Added option `addcsvdata <FieldName> <String>` to `gam print courses`
|
||||
|
||||
@@ -49,7 +49,7 @@ For calendars, there is an option to indicate whether to release resources for f
|
||||
A `<TransferID>` is returned which can be used to monitor the progress of the transfer.
|
||||
|
||||
NOTE: For calendars, the behaviour is not sufficiently defined in the API documentation.
|
||||
As of 2020-06-10, background transfers only transfer future non-private events with at least one guest/resource.
|
||||
Background transfers only transfer future non-private events with at least one guest/resource.
|
||||
|
||||
The option `<ParameterKey> <ParameterValue>` is for future expansion.
|
||||
|
||||
|
||||
@@ -680,5 +680,7 @@ To retrieve the count with `showitemcountonly`:
|
||||
Linux/MacOS
|
||||
count=$(gam print groups showitemcountonly)
|
||||
Windows PowerShell
|
||||
count = & gam print groups showitemcountonly
|
||||
```
|
||||
$count = & gam print groups showitemcountonly
|
||||
Windows Command Prompt
|
||||
for /f "delims=" %a in ('gam print groups showitemcountonly') do set count=%a
|
||||
|
||||
|
||||
@@ -252,10 +252,10 @@ writes the credentials into the file oauth2.txt.
|
||||
admin@server:/Users/admin$ rm -f /Users/admin/GAMConfig/oauth2.txt
|
||||
admin@server:/Users/admin$ gam version
|
||||
WARNING: Config File: /Users/admin/GAMConfig/gam.cfg, Section: DEFAULT, Item: oauth2_txt, Value: /Users/admin/GAMConfig/oauth2.txt, Not Found
|
||||
GAM 7.27.05 - https://github.com/GAM-team/GAM - pyinstaller
|
||||
GAM 7.30.03 - https://github.com/GAM-team/GAM - pyinstaller
|
||||
GAM Team <google-apps-manager@googlegroups.com>
|
||||
Python 3.14.0 64-bit final
|
||||
macOS Tahoe 26.0.1 x86_64
|
||||
Python 3.14.2 64-bit final
|
||||
macOS Tahoe 26.1 x86_64
|
||||
Path: /Users/admin/bin/gam7
|
||||
Config File: /Users/admin/GAMConfig/gam.cfg, Section: DEFAULT, customer_id: my_customer, domain: domain.com
|
||||
|
||||
@@ -990,10 +990,10 @@ writes the credentials into the file oauth2.txt.
|
||||
C:\>del C:\GAMConfig\oauth2.txt
|
||||
C:\>gam version
|
||||
WARNING: Config File: C:\GAMConfig\gam.cfg, Section: DEFAULT, Item: oauth2_txt, Value: C:\GAMConfig\oauth2.txt, Not Found
|
||||
GAM 7.27.05 - https://github.com/GAM-team/GAM - pythonsource
|
||||
GAM 7.30.03 - https://github.com/GAM-team/GAM - pythonsource
|
||||
GAM Team <google-apps-manager@googlegroups.com>
|
||||
Python 3.14.0 64-bit final
|
||||
Windows-10-10.0.17134 AMD64
|
||||
Python 3.14.2 64-bit final
|
||||
Windows 11 10.0.26200 AMD64
|
||||
Path: C:\GAM7
|
||||
Config File: C:\GAMConfig\gam.cfg, Section: DEFAULT, customer_id: my_customer, domain: domain.com
|
||||
|
||||
|
||||
@@ -235,10 +235,6 @@ nv:<String>:<String>
|
||||
The first `<String>` is a Product and the second `<String>` is a SKU.
|
||||
|
||||
## Info User Performance
|
||||
|
||||
In GAM versions prior 7.18.05, when you did `gam info user`, GAM would make one attempt to get the user's licenses.
|
||||
If something went wrong, you might not get the complete list.
|
||||
|
||||
The License Manager API doesn't have a call that returns the list of licenses that a user has; you have to ask:
|
||||
```
|
||||
Does user have license SKU 1?
|
||||
|
||||
@@ -173,5 +173,7 @@ To retrieve the count with `showitemcountonly`:
|
||||
Linux/MacOS
|
||||
count=$(gam print mobile showitemcountonly)
|
||||
Windows PowerShell
|
||||
count = & gam print mobile showitemcountonly
|
||||
$count = & gam print mobile showitemcountonly
|
||||
Windows Command Prompt
|
||||
for /f "delims=" %a in ('gam print mobile showitemcountonly') do set count=%a
|
||||
```
|
||||
|
||||
@@ -32,7 +32,6 @@
|
||||
<OrgUnitFieldName> ::=
|
||||
description|
|
||||
id|orgunitid|
|
||||
inherit|blockinheritance|
|
||||
name|
|
||||
parentid|parentorgunitid|
|
||||
parent|parentorgunitpath|
|
||||
@@ -73,18 +72,15 @@ For quoting rules, see: [List Quoting Rules](Command-Line-Parsing)
|
||||
Create, update and delete organization units.
|
||||
```
|
||||
gam create org|ou <OrgUnitPath> [description <String>]
|
||||
[parent <OrgUnitItem>] [inherit|(blockinheritance False)]
|
||||
[parent <OrgUnitItem>]
|
||||
[buildpath]
|
||||
gam update org|ou <OrgUnitPath> [name <String>] [description <String>]
|
||||
[parent <OrgUnitItem>] [inherit|(blockinheritance False)]
|
||||
[parent <OrgUnitItem>]
|
||||
gam delete org|ou <OrgUnitPath>
|
||||
gam update orgs|ous <OrgUnitEntity> [name <String>] [description <String>]
|
||||
[parent <OrgUnitItem>] [inherit|(blockinheritance False)]
|
||||
[parent <OrgUnitItem>]
|
||||
gam delete orgs|ous <OrgUnitEntity>
|
||||
```
|
||||
Inheritance specifies whether sub-OUs of the specified OU inherit its settings.
|
||||
* `inherit|blockinheritance false` - Sub-OUs inherit settings from the specified OU; this is the default
|
||||
|
||||
## Add users to an organizational unit
|
||||
When adding users to an OU, Gam uses a batch method to speed up processing.
|
||||
|
||||
@@ -266,7 +262,9 @@ To retrieve the count with `showitemcountonly`:
|
||||
Linux/MacOS
|
||||
count=$(gam print orgs showitemcountonly)
|
||||
Windows PowerShell
|
||||
count = & gam print orgs showitemcountonly
|
||||
$count = & gam print orgs showitemcountonly
|
||||
Windows Command Prompt
|
||||
for /f "delims=" %a in ('gam print orgs showitemcountonly') do set count=%a
|
||||
```
|
||||
|
||||
## Display indented organizational unit tree
|
||||
|
||||
@@ -14,5 +14,10 @@ Thank you.
|
||||
* Korey Rideout - https://chatgpt.com/g/g-PTxxnVPMG-gam-assist-now-turbocharged-with-gam7
|
||||
* Paul Ogier (Taming.Tech) - GAM7 Course on Udemy https://taming.tech/GAMCourse
|
||||
* Paul Ogier (Taming.Tech) - GAM7 Tutorials https://www.youtube.com/watch?v=g9LDeyXQNLI&list=PL_dLiK09pJVhKJxZHNk9CHK0q5hkZ856w
|
||||
* Paul Ogier (Taming.Tech) - Installation videos
|
||||
* GAM7 Windows Install - https://www.youtube.com/watch?v=l8pTF5UWz7o&list=PL_dLiK09pJVhKJxZHNk9CHK0q5hkZ856w&index=4
|
||||
* GAM7 macOS Install - https://www.youtube.com/watch?v=eaLWpxhC91w&list=PL_dLiK09pJVhKJxZHNk9CHK0q5hkZ856w&index=5
|
||||
* GAM7 Ubuntu Linux Install - https://www.youtube.com/watch?v=zBwhNTxGlcM&list=PL_dLiK09pJVhKJxZHNk9CHK0q5hkZ856w&index=7
|
||||
* GAM7 ChromeOS Install - https://www.youtube.com/watch?v=BNWQh8GqvgY&list=PL_dLiK09pJVhKJxZHNk9CHK0q5hkZ856w&index=6
|
||||
* Paul Ogier (Taming.Tech) - https://taming.tech/taming-gam-a-practical-guide-to-gam-and-gamadv-xtd3/
|
||||
* Steve Larsen - https://docs.google.com/spreadsheets/d/1MzzA-u-cmoQcJnQOovCnZcEKMjvOyFhfkdFdf10X_GI/edit
|
||||
|
||||
@@ -12,9 +12,13 @@
|
||||
- [User reports](#user-reports)
|
||||
|
||||
## API documentation
|
||||
Changes starting 2025-10-29.
|
||||
* [Activity Data Sources](https://support.google.com/a/answer/11482175)
|
||||
|
||||
* [Reports API - Admin log event changes]https://support.google.com/a/answer/16601511
|
||||
Changes starting 2025-10-29.
|
||||
* [Reports API - Admin log event changes](https://support.google.com/a/answer/16601511)
|
||||
|
||||
Changes starting 2025-12-20
|
||||
* [Reports API - Admin log enhancements](https://workspaceupdates.googleblog.com/2025/12/google-workspace-audit-log-api.html)
|
||||
|
||||
These pages show event/parameter names; scroll down in the left column to: Reports.
|
||||
|
||||
@@ -45,27 +49,41 @@ config csv_output_row_filter "'\"accounts:used_quota_in_mb\":count>15000'"
|
||||
## Activity reports
|
||||
```
|
||||
<ActivityApplicationName> ::=
|
||||
accessevaluation|
|
||||
accesstransparency|access|
|
||||
admin|
|
||||
admindataaction|
|
||||
assignments|
|
||||
calendar|calendars|
|
||||
chat|
|
||||
chrome|
|
||||
classroom|
|
||||
cloudsearch|
|
||||
contacts|
|
||||
contextawareaccess|
|
||||
gplus|currents|google+|
|
||||
datamigration|
|
||||
datastudio|
|
||||
directorysync|
|
||||
drive|doc|docs|
|
||||
gcp|cloud|
|
||||
geminiinworkspaceapps|gemini|geminiforworkspace|
|
||||
gmail|
|
||||
gplus|currents|google+|
|
||||
graduation|
|
||||
groups|group|
|
||||
groupsenterprise|enterprisegroups|
|
||||
jamboard|
|
||||
keep|
|
||||
ldap|
|
||||
login|logins|
|
||||
meet|hangoutsmeet|
|
||||
meethardware|
|
||||
mobile|devices|
|
||||
profile|
|
||||
rules|
|
||||
saml|
|
||||
takeout|
|
||||
tasks|
|
||||
token|tokens|oauthtoken|
|
||||
useraccounts|
|
||||
vault
|
||||
@@ -76,7 +94,7 @@ gam report <ActivityApplicationName> [todrive <ToDriveAttribute>*]
|
||||
yesterday|today|thismonth|(previousmonths <Integer>)]
|
||||
[filter <String> (filtertime<String> <Time>)*]
|
||||
[event|events <EventNameList>] [ip <String>]
|
||||
[groupidfilter <String>]
|
||||
[groupidfilter <String>] [resourcedetailsfilter <String>]
|
||||
[maxactivities <Number>] [maxevents <Number>] [maxresults <Number>]
|
||||
[countsonly [bydate|summary] [eventrowfilter]]
|
||||
(addcsvdata <FieldName> <String>)* [shownoactivities]
|
||||
@@ -110,6 +128,12 @@ The `filtertime<String> <Time>` value replaces the string `#filtertime<String>#`
|
||||
The characters following `filtertime` can be any combination of lowercase letters and numbers. This is most useful in scripts
|
||||
where you can specify a relative date without having to change the script.
|
||||
|
||||
Limit to those users that are a member of at least one of a list of groups.
|
||||
* `groupidfilter <String>` - Format: "id:abc123,id:xyz456"
|
||||
|
||||
Limit based on resource details.
|
||||
* `resourcedetailsfilter <String>` - See: https://developers.google.com/workspace/admin/reports/reference/rest/v1/activities/list#query-parameters
|
||||
|
||||
You can use `config csv_output_row_filter` to filter the events if the API filter can't produce the results you want.
|
||||
|
||||
Limit to a list of specific events.
|
||||
@@ -118,9 +142,6 @@ Limit to a list of specific events.
|
||||
Limit to a specific IP address.
|
||||
* `ip <String>`
|
||||
|
||||
Limit to those users that are a member of at least one of a list of groups.
|
||||
* `groupidfilter <String>` - Format: "id:abc123,id:xyz456"
|
||||
|
||||
Limit the total number of activites.
|
||||
* `maxactivities <Number>`
|
||||
|
||||
@@ -213,6 +234,7 @@ gam report usage customer [todrive <ToDriveAttribute>*]
|
||||
[skipdates <Date>[:<Date>](,<Date>[:<Date>])*] [skipdaysofweek <DayOfWeek>(,<DayOfWeek>)*]
|
||||
[fields|parameters <String>]
|
||||
[convertmbtogb]
|
||||
(addcsvdata <FieldName> <String>)*
|
||||
```
|
||||
Limit the time period.
|
||||
* `start <Date>` - Default value is 30 days prior to `end <Date>`
|
||||
@@ -224,8 +246,10 @@ Limit the time period.
|
||||
Option `convertmbtogb` causes GAM to convert parameters expressed in megabytes
|
||||
(name ends with _in_mb) to gigabytes (name converted to _in_gb) with two decimal places.
|
||||
|
||||
Add additional columns of data from the command line to the output.
|
||||
* `addcsvdata <FieldName> <String>`
|
||||
|
||||
### Example
|
||||
Jay provided this example.
|
||||
```
|
||||
gam report usage customer parameters meet:total_call_minutes,meet:total_meeting_minutes start_date 2020-03-01 skipdaysofweek sat,sun todrive
|
||||
```
|
||||
@@ -267,6 +291,7 @@ gam report customers|customer|domain [todrive <ToDriveAttribute>*]
|
||||
[(fields|parameters <String>)|(services <CustomerServiceNameList>)]
|
||||
[noauthorizedapps]
|
||||
[convertmbtogb]
|
||||
(addcsvdata <FieldName> <String>)*
|
||||
```
|
||||
Specify the report date; the default is today's date.
|
||||
* `date <Date>` - A single date; there is one API call
|
||||
@@ -279,6 +304,9 @@ Specify the report date; the default is today's date.
|
||||
Option `convertmbtogb` causes GAM to convert parameters expressed in megabytes
|
||||
(name ends with _in_mb) to gigabytes (name converted to _in_gb) with two decimal places.
|
||||
|
||||
Add additional columns of data from the command line to the output.
|
||||
* `addcsvdata <FieldName> <String>`
|
||||
|
||||
If no report is available for the specified date, can an earlier date be used?
|
||||
* `limitdatechanges -1' - Back up to earlier dates to find report data; this is the default.
|
||||
* `limitdatechanges 0 | nodatechange' - Do not report on an earlier date if no report data is available for the specified date.
|
||||
@@ -332,6 +360,7 @@ gam report usage user [todrive]
|
||||
[skipdates <Date>[:<Date>](,<Date>[:<Date>])*] [skipdaysofweek <DayOfWeek>(,<DayOfWeek>)*]
|
||||
[fields|parameters <String>]
|
||||
[convertmbtogb]
|
||||
(addcsvdata <FieldName> <String>)*
|
||||
```
|
||||
Select the users for whom information is desired.
|
||||
* `user all` - All users, the default; there is one API call
|
||||
@@ -350,6 +379,9 @@ Limit the time period.
|
||||
Option `convertmbtogb` causes GAM to convert parameters expressed in megabytes
|
||||
(name ends with _in_mb) to gigabytes (name converted to _in_gb) with two decimal places.
|
||||
|
||||
Add additional columns of data from the command line to the output.
|
||||
* `addcsvdata <FieldName> <String>`
|
||||
|
||||
## User reports
|
||||
User reports are generally available up to four days before the current date.
|
||||
```
|
||||
@@ -374,6 +406,7 @@ gam report users|user [todrive <ToDriveAttribute>*]
|
||||
[aggregatebydate|aggregatebyuser [Boolean]]
|
||||
[maxresults <Number>]
|
||||
[convertmbtogb]
|
||||
(addcsvdata <FieldName> <String>)*
|
||||
```
|
||||
Select the users for whom information is desired.
|
||||
* `user all` - All users, the default; there is one API call
|
||||
@@ -396,6 +429,16 @@ Specify the report date; the default is today's date.
|
||||
Option `convertmbtogb` causes GAM to convert parameters expressed in megabytes
|
||||
(name ends with _in_mb) to gigabytes (name converted to _in_gb) with two decimal places.
|
||||
|
||||
Add additional columns of data from the command line to the output.
|
||||
* `addcsvdata <FieldName> <String>`
|
||||
|
||||
This will be most useful when reading a CSV of user information and you want to include some of the user information,
|
||||
e.g., orgUnitPath, in the output.
|
||||
```
|
||||
gam redirect csv ./Users.csv print users fields ou
|
||||
gam redirect csv ./UserStorageInfo.csv multiprocess csv Users.csv gam report users user "~primaryEmail" parameters accounts:drive_used_quota_in_mb,accounts:gmail_used_quota_in_mb,accounts:gplus_photos_used_quota_in_mb,accounts:total_quota_in_mb,accounts:used_quota_in_mb,accounts:used_quota_in_percentage addcsvdata orgUnitPath "~orgUnitPath"
|
||||
```
|
||||
|
||||
If no report is available for the specified date, can an earlier date be used?
|
||||
* `limitdatechanges -1' - Back up to earlier dates to find report data; this is the default.
|
||||
* `limitdatechanges 0 | nodatechange' - Do not report on an earlier date if no report data is available for the specified date.
|
||||
@@ -452,6 +495,11 @@ Report on users total storage usage.
|
||||
```
|
||||
gam report users parameters accounts:drive_used_quota_in_mb,accounts:gmail_used_quota_in_mb,accounts:gplus_photos_used_quota_in_mb,accounts:total_quota_in_mb,accounts:used_quota_in_mb,accounts:used_quota_in_percentage
|
||||
```
|
||||
Report on users total storage usage, include OrgUnitPath
|
||||
```
|
||||
gam redirect csv ./Users.csv print users fields ou
|
||||
gam redirect csv ./UserStorageInfo.csv multiprocess csv Users.csv gam report users user "~primaryEmail" parameters accounts:drive_used_quota_in_mb,accounts:gmail_used_quota_in_mb,accounts:gplus_photos_used_quota_in_mb,accounts:total_quota_in_mb,accounts:used_quota_in_mb,accounts:used_quota_in_percentage addcsvdata orgUnitPath "~orgUnitPath"
|
||||
```
|
||||
Report on email activity for individual users.
|
||||
```
|
||||
$ gam report users select users testuser1,testuser2,testuser3 fields gmail:num_emails_received,gmail:num_emails_sent range 2025-07-01 2025-07-07
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
# Reseller
|
||||
- [API documentation](#api-documentation)
|
||||
- [Notes](#notes)
|
||||
- [Manage Multiple Domains](#manage-multiple-domains)
|
||||
- [Definitions](#definitions)
|
||||
- [Manage Resold Customers](#manage-resold-customers)
|
||||
@@ -12,20 +11,6 @@
|
||||
* [Reseller API - Customers](https://developers.google.com/admin-sdk/reseller/v1/reference/customers)
|
||||
* [Reseller API - Subscriptions](https://developers.google.com/admin-sdk/reseller/v1/reference/subscriptions)
|
||||
|
||||
## Notes
|
||||
|
||||
Updated handling of `seats` option in `gam create|update resoldsubscription` to properly assign
|
||||
the API fields `numberOfSeats` and `maximumNumberOfSeats`.
|
||||
Prior to version 6.50.00, this is how the `seats <NumberOfSeats> <MaximumNumberOfSeats>` option was processed:
|
||||
* Plan name `ANNUAL_MONTHLY_PAY` or `ANNUAL_YEARLY_PAY`
|
||||
* `seats <NumberOfSeats>` - `<NumberOfSeats>` was properly passed to the API
|
||||
* `seats <NumberOfSeats> <MaximumNumberOfSeats>` - `<NumberOfSeats>` was properly passed to the API; `<MaximumNumberOfSeats>` was passed to the API which ignored it
|
||||
* Plan name `FLEXIBLE` or `TRIAL`
|
||||
* `seats <NumberOfSeats>` - `<NumberOfSeats>` was improperly passed to the API; an API error was generated
|
||||
* `seats <NumberOfSeats> <MaximumNumberOfSeats>` - `<MaximumNumberOfSeats>` was properly passed to the API; `<NumberOfSeats>` was passed to the API which ignored it
|
||||
|
||||
Now, you can still use the above option which has been corrected or you can specify `seats <Number>` which will be properly passed in the correct form to the API based on plan name.
|
||||
|
||||
## Manage Multiple Domains
|
||||
Thanks to Duncan Isaksen-Loxton for a script to help manage multiple domains.
|
||||
|
||||
|
||||
@@ -84,6 +84,7 @@ See [Collections of Items](Collections-of-Items)
|
||||
(zipcode|postalcode <String>)
|
||||
|
||||
<ResourceAttribute> ::=
|
||||
(autoacceptinvitations [<Boolean>])|
|
||||
(addfeatures <FeatureNameList>)|
|
||||
(buildingid <BuildingID>)|
|
||||
(capacity <Number>)|
|
||||
@@ -99,6 +100,7 @@ See [Collections of Items](Collections-of-Items)
|
||||
|
||||
<ResourceFieldName> ::=
|
||||
acls|
|
||||
autoacceptinvitations|
|
||||
buildingid|
|
||||
calendar|
|
||||
capacity|
|
||||
@@ -512,7 +514,9 @@ To retrieve the count with `showitemcountonly`:
|
||||
Linux/MacOS
|
||||
count=$(gam print resources showitemcountonly)
|
||||
Windows PowerShell
|
||||
count = & gam print resources showitemcountonly
|
||||
$count = & gam print resources showitemcountonly
|
||||
Windows Command Prompt
|
||||
for /f "delims=" %a in ('gam print resources showitemcountonly') do set count=%a
|
||||
```
|
||||
|
||||
## Manage resource calendar ACLs
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# Scripts
|
||||
|
||||
These scripts can be used to enhance GAM's capabilities; all are supported with Advanced GAM,
|
||||
many are supported with Legacy GAM. They require that Python 3 be installed on you computer.
|
||||
These scripts can be used to enhance GAM's capabilities; all are supported with GAM7,
|
||||
many are supported with Legacy GAM. They require that Python 3.10 or higher be installed on your computer.
|
||||
|
||||
* https://github.com/taers232c/GAM-Scripts3
|
||||
* https://www.python.org/
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
* [Move content to Shared Drives](https://support.google.com/a/answer/7374057)
|
||||
* [Shared Drive Limits](https://support.google.com/a/users/answer/7338880)
|
||||
* [Shared Drives in Org Units](https://support.google.com/a/answer/7337635)
|
||||
* [Shared Drive Restrictions](https://developers.google.com/workspace/drive/api/guides/manage-shareddrives#backward-compatibility)
|
||||
|
||||
## Query documentation
|
||||
* [Shared Drives Search](https://developers.google.com/drive/api/guides/search-shareddrives)
|
||||
@@ -80,6 +81,15 @@
|
||||
<ColorValue> ::= <ColorName>|<ColorHex>
|
||||
```
|
||||
```
|
||||
<CSVFileInput> ::=
|
||||
((<FileName> [charset <Charset>] )|
|
||||
(gsheet <UserGoogleSheet>)|
|
||||
(gdoc <UserGoogleDoc>)|
|
||||
(gcscsv <StorageBucketObjectName>)|
|
||||
(gcsdoc <StorageBucketObjectName>))
|
||||
[warnifnodata] [columndelimiter <Character>] [noescapechar <Boolean>] [quotechar <Character>]
|
||||
[endcsv|(fields <FieldNameList>)]
|
||||
|
||||
<JSONData> ::= (json [charset <Charset>] <String>) | (json file <FileName> [charset <Charset>]) |
|
||||
|
||||
<OrganizerType> ::= user|group
|
||||
@@ -94,7 +104,8 @@
|
||||
<REMatchPattern> ::= <RegularExpression>
|
||||
<RESearchPattern> ::= <RegularExpression>
|
||||
<RESubstitution> ::= <String>>
|
||||
|
||||
```
|
||||
```
|
||||
<DriveFileOrderByFieldName> ::=
|
||||
createddate|createdtime|
|
||||
folder|
|
||||
@@ -288,6 +299,10 @@ gam [<UserTypeEntity>] create shareddrive <Name>
|
||||
* `[restrictions.]<SharedDriveRestrictionsSubfieldName> <Boolean>` - Set Shared Drive Restrictions
|
||||
* `hide <Boolean>` - Set Shared Drive visibility
|
||||
|
||||
`<SharedDriveRestrictionsSubfieldName>` `copyrequireswriterpermission` can not be used with
|
||||
`downloadrestrictedforreaders|downloadrestrictions.restrictedforreaders` or
|
||||
`downloadrestrictedforreadersdownloadrestrictions.restrictedforwriters`.
|
||||
|
||||
If any attributes other than `themeid` are specified, GAM must create the Drive and then update the Drive attributes.
|
||||
Even though the Create API returns success, the Update API fails and reports that the Drive does not exist.
|
||||
* `errorretries <Integer>` - Number of create/update error retries; default value 5, range 0-10
|
||||
@@ -315,6 +330,8 @@ Linux/MacOS
|
||||
teamDriveId=$(gam create shareddrive ... returnidonly)
|
||||
Windows PowerShell
|
||||
$teamDriveId = & gam create shareddrive ... returnidonly
|
||||
Windows Command Prompt
|
||||
for /f "delims=" %a in ('gam create shareddrive ... returnidonly') do set teamDriveId=%a
|
||||
```
|
||||
|
||||
## Bulk Create Shared Drives
|
||||
@@ -368,6 +385,10 @@ gam [<UserTypeEntity>] update shareddrive <SharedDriveEntity> [name <Name>]
|
||||
* `[restrictions.]<SharedDriveRestrictionsSubfieldName> <Boolean>` - Set Shared Drive Restrictions
|
||||
* `hidden <Boolean>` - Set Shared Drive visibility
|
||||
|
||||
`<SharedDriveRestrictionsSubfieldName>` `copyrequireswriterpermission` can not be used with
|
||||
`downloadrestrictedforreaders|downloadrestrictions.restrictedforreaders` or
|
||||
`downloadrestrictedforreadersdownloadrestrictions.restrictedforwriters`.
|
||||
|
||||
* `ou|org|orgunit <OrgUnitItem>` - See: https://workspaceupdates.googleblog.com/2022/05/shared-drives-in-organizational-units-open-beta.html
|
||||
|
||||
This option is only available when the command is run as an administrator.
|
||||
@@ -537,7 +558,9 @@ To retrieve the count with `showitemcountonly`:
|
||||
Linux/MacOS
|
||||
count=$(gam print shareddrives showitemcountonly)
|
||||
Windows PowerShell
|
||||
count = & gam print shareddrives showitemcountonly
|
||||
$count = & gam print shareddrives showitemcountonly
|
||||
Windows Command Prompt
|
||||
for /f "delims=" %a in ('gam print shareddrives showitemcountonly') do set count=%a
|
||||
```
|
||||
|
||||
## Display all Shared Drives with a specific organizer
|
||||
@@ -590,7 +613,9 @@ To retrieve the count with `showitemcountonly`:
|
||||
Linux/MacOS
|
||||
count=$(gam print oushareddrives showitemcountonly)
|
||||
Windows PowerShell
|
||||
count = & gam print oushareddrives showitemcountonly
|
||||
$count = & gam print oushareddrives showitemcountonly
|
||||
Windows Command Prompt
|
||||
for /f "delims=" %a in ('gam print oushareddrives showitemcountonly') do set count=%a
|
||||
```
|
||||
|
||||
## Manage Shared Drive access
|
||||
@@ -643,15 +668,23 @@ When deleting permissions from JSON data, permissions with role `owner` true are
|
||||
These commands are used to transfer ACLs from one Shared Drive to another.
|
||||
* `copy` - Copy all ACLs from the source Shared Drive to the target Shared Drive. The role of an existing ACL in the target Shared Drive will never be reduced.
|
||||
* `sync` - Add/delete/update ACLs in the target Shared Drive to match those in the source Shared Drive.
|
||||
|
||||
* `<UserTypeEntity>` - Not Specified
|
||||
* All Shared Drives must be in the same workspace as the admin in `oauth2.txt`.
|
||||
* `<UserTypeEntity>` - Specified
|
||||
* `adminaccess|asadmin` specified - All Shared Drives must be in the same workspace as `<UserTypeEntity>`.
|
||||
* `adminaccess|asadmin` not specified - Shared Drives can be in separate workspaces if `<UserTypeEntity>` in a manager of all of them.
|
||||
```
|
||||
gam [<UserTypeEntity>] copy shareddriveacls <SharedDriveEntity> to <SharedDriveEntity>
|
||||
[showpermissionsmessages [<Boolean>]]
|
||||
[excludepermissionsfromdomains|includepermissionsfromdomains <DomainNameList>]
|
||||
(mappermissionsemail <EmailAddress> <EmailAddress)* [mappermissionsemailfile <CSVFileInput> endcsv]
|
||||
(mappermissionsdomain <DomainName> <DomainName>)*
|
||||
[adminaccess|asadmin]
|
||||
gam [<UserTypeEntity>] sync shareddriveacls <SharedDriveEntity> with <SharedDriveEntity>
|
||||
[showpermissionsmessages [<Boolean>]]
|
||||
[excludepermissionsfromdomains|includepermissionsfromdomains <DomainNameList>]
|
||||
(mappermissionsemail <EmailAddress> <EmailAddress)* [mappermissionsemailfile <CSVFileInput> endcsv]
|
||||
(mappermissionsdomain <DomainName> <DomainName>)*
|
||||
[adminaccess|asadmin]
|
||||
```
|
||||
@@ -659,8 +692,14 @@ When `excludepermissionsfromdomains <DomainNameList>` is specified, any ACL that
|
||||
|
||||
When `includepermissionsfromdomains <DomainNameList>` is specified, only ACLs that reference a domain in `<DomainNameList>` will be copied.
|
||||
|
||||
When `mappermissionsemail <EmailAddress> <EmailAddress>` is specifed, an ACL that references the first `<EmailAddress>` will be modified
|
||||
to reference the second `<EmailAddress>` when copied; the original ACL is not modified. The option can be repeated if multiple email addresses are to be mapped.
|
||||
|
||||
Bulk permission email address mapping can be specified with `mappermissionsemailfile <CSVFileInput> endcsv`.
|
||||
`<CSVFileInput>` must include these columns: `sourceEmail` and `destinationEmail`.
|
||||
|
||||
When `mappermissionsdomain <DomainName> <DomainName>` is specifed, any ACL that references the first `<DomainName>` will be modified
|
||||
to reference the second `<DonainName>` when copied; the original ACL is not modified. The option can be repeated if multiple domain names are to me mapped.
|
||||
to reference the second `<DomainName>` when copied; the original ACL is not modified. The option can be repeated if multiple domain names are to be mapped.
|
||||
|
||||
## Display Shared Drive access
|
||||
|
||||
|
||||
@@ -114,6 +114,8 @@
|
||||
<CourseState> ::= active|archived|provisioned|declined
|
||||
<CourseStateList> ::= all|"<CourseState>(,<CourseState>)*"
|
||||
<iCalUID> ::= <String>
|
||||
<MeetID> ::= <String>
|
||||
Must match this Python Regular Expression: [a-z]{3}-[a-z]{4}-[a-z]{3}
|
||||
<ResourceID> ::= <String>
|
||||
<ResourceIDList> ::= "<ResourceID>(,<ResourceID>)*"
|
||||
<UniqueID> ::= id:<String>
|
||||
@@ -215,7 +217,8 @@
|
||||
endtimeunspecified|
|
||||
extendedproperties|
|
||||
eventtype|
|
||||
<EventFocusTimePropertiesSubfieldName>
|
||||
focustimeproperties|
|
||||
<EventFocusTimePropertiesSubfieldName>|
|
||||
gadget|
|
||||
guestscaninviteothers|
|
||||
guestscanmodify|
|
||||
@@ -229,7 +232,8 @@
|
||||
organizer|
|
||||
<EventOrganizerSubfieldName>|
|
||||
originalstart|originalstarttime|
|
||||
<EventOutOfOfficePropertiesSubfieldName>
|
||||
outofofficeproperties|
|
||||
<EventOutOfOfficePropertiesSubfieldName>|
|
||||
privatecopy|
|
||||
recurrence|
|
||||
recurringeventid|
|
||||
@@ -320,6 +324,7 @@
|
||||
(birthday <Date>)|
|
||||
(color <EventColorName>)|
|
||||
(colorindex|colorid <EventColorIndex>)|
|
||||
(conferencedata meet <MeetID>)|
|
||||
(description <String>)|
|
||||
(end|endtime (allday <Date>)|<Time>)|
|
||||
(guestscaninviteothers <Boolean>)|
|
||||
@@ -327,7 +332,7 @@
|
||||
(guestscanmodify <Boolean>)|
|
||||
(guestscanseeotherguests <Boolean>)|
|
||||
guestscantseeotherguests|
|
||||
hangoutsmeet|
|
||||
googlemeet|hangoutsmeet|
|
||||
<JSONData>|
|
||||
(jsonattendees [charset <Charset>] <String>)|
|
||||
(jsonattendees file <FileName> [charset <Charset>])|
|
||||
@@ -368,7 +373,7 @@ The following attributes are equivalent:
|
||||
<EventAttribute>|
|
||||
clearattachments|
|
||||
clearattendees|
|
||||
clearhangoutsmeet|
|
||||
cleargooglemeet|clearhangoutsmeet|
|
||||
(clearprivateproperty <PropertyKey>)|
|
||||
clearresources|
|
||||
(clearsharedproperty <PropertyKey>)|
|
||||
@@ -718,7 +723,7 @@ properly processed.
|
||||
```
|
||||
gam <UserTypeEntity> update calattendees <UserCalendarEntity> <EventEntity> [anyorganizer]
|
||||
[<EventNotificationAttribute>] [splitupdate] [dryrun|doit]
|
||||
(csv|csvfile <CSVFileInput>)
|
||||
(csv|csvfile <CSVFileInput> endcsv)
|
||||
(delete <EmailAddress>)*
|
||||
(deleteentity <EmailAddressEntity>)*
|
||||
(add <EmailAddress>)*
|
||||
@@ -774,27 +779,43 @@ The attendee changes are displayed but not processed unless `doit` is specified.
|
||||
## Focus time events
|
||||
|
||||
## Manage focus time events
|
||||
You can create and delete focus time events; they can not be updated.
|
||||
To update a focus time event, delete the focus time event and recreate it.
|
||||
To update a focus time event, see: [Update calendar events](#update-calendar-events)
|
||||
```
|
||||
gam <UserTypeEntity> create focustime
|
||||
[chatstatus available|donotdisturb]|
|
||||
[declinemode none|all|new] [declinemessage <String>]|
|
||||
[summary <String>]
|
||||
(timerange <Time> <Time>
|
||||
(recurrence <RRULE, EXRULE, RDATE and EXDATE line>)*
|
||||
((date yyyy-mm-dd)|
|
||||
(range yyyy-mm-dd yyyy-mm-dd)|
|
||||
(daily yyyy-mm-dd <Number>)|
|
||||
(weekly yyyy-mm-dd <Number>)|
|
||||
(timerange <Time> <Time> (recurrence <RRULE, EXRULE, RDATE and EXDATE line>)*))+
|
||||
[timezone <String>]
|
||||
(noreminders|(reminder email|popup <Number>)+)
|
||||
|
||||
gam <UserTypeEntity> delete focustime
|
||||
(timerange <Time> <Time>)+
|
||||
((date yyyy-mm-dd)|
|
||||
(range yyyy-mm-dd yyyy-mm-dd)|
|
||||
(daily yyyy-mm-dd <Number>)|
|
||||
(weekly yyyy-mm-dd <Number>)|
|
||||
(timerange <Time> <Time>))+
|
||||
```
|
||||
|
||||
focus time events span a time range:
|
||||
Focus time events span a time range:
|
||||
* `date yyyy-mm-dd` - A specific day
|
||||
* `range yyyy-mm-dd yyyy-mm-dd` - Every day in the range
|
||||
* `daily yyyy-mm-dd <Number>` - Every day starting on the date for `<Number>` total days
|
||||
* `weekly yyyy-mm-dd <Number>` - A day per week starting on the date for `<Number>` total weeks
|
||||
* `timerange <Time> <Time>` - A time range, may span multiple days
|
||||
|
||||
## Display focus time events
|
||||
```
|
||||
gam <UserTypeEntity> show focustime
|
||||
(timerange <Time> <Time>)+
|
||||
((date yyyy-mm-dd)|
|
||||
(range yyyy-mm-dd yyyy-mm-dd)|
|
||||
(daily yyyy-mm-dd <Number>)|
|
||||
(weekly yyyy-mm-dd <Number>)|
|
||||
(timerange <Time> <Time>))+
|
||||
[showdayofweek]
|
||||
[formatjson]
|
||||
```
|
||||
@@ -805,7 +826,11 @@ By default, Gam displays the information as an indented list of keys and values.
|
||||
|
||||
```
|
||||
gam <UserTypeEntity> print focustime
|
||||
(timerange <Time> <Time>)+
|
||||
((date yyyy-mm-dd)|
|
||||
(range yyyy-mm-dd yyyy-mm-dd)|
|
||||
(daily yyyy-mm-dd <Number>)|
|
||||
(weekly yyyy-mm-dd <Number>)|
|
||||
(timerange <Time> <Time>))+
|
||||
[showdayofweek]
|
||||
[formatjson [quotechar <Character>]] [todrive <ToDriveAttribute>*]
|
||||
```
|
||||
@@ -825,27 +850,39 @@ The `quotechar <Character>` option allows you to choose an alternate quote chara
|
||||
## Out of office events
|
||||
|
||||
## Manage out of office events
|
||||
You can create and delete out of office events; they can not be updated.
|
||||
To update an out of office event, delete the out of office event and recreate it.
|
||||
To update an out of office event, see: [Update calendar events](#update-calendar-events)
|
||||
```
|
||||
gam <UserTypeEntity> create outofoffice
|
||||
[declinemode none|all|new]
|
||||
[declinemessage <String>]
|
||||
[summary <String>]
|
||||
(timerange <Time> <Time>
|
||||
(recurrence <RRULE, EXRULE, RDATE and EXDATE line>)*
|
||||
((date yyyy-mm-dd)|
|
||||
(range yyyy-mm-dd yyyy-mm-dd)|
|
||||
(daily yyyy-mm-dd <Number>)|
|
||||
(weekly yyyy-mm-dd <Number>)|
|
||||
(timerange <Time> <Time> (recurrence <RRULE, EXRULE, RDATE and EXDATE line>)*))+
|
||||
[timezone <String>]
|
||||
(noreminders|(reminder email|popup <Number>)+)
|
||||
|
||||
gam <UserTypeEntity> delete outofoffice
|
||||
(timerange <Time> <Time>)+
|
||||
```
|
||||
|
||||
Out of office events span a time range:
|
||||
* `date yyyy-mm-dd` - A specific day
|
||||
* `range yyyy-mm-dd yyyy-mm-dd` - Every day in the range
|
||||
* `daily yyyy-mm-dd <Number>` - Every day starting on the date for `<Number>` total days
|
||||
* `weekly yyyy-mm-dd <Number>` - A day per week starting on the date for `<Number>` total weeks
|
||||
* `timerange <Time> <Time>` - A time range, may span multiple days
|
||||
|
||||
## Display out of office events
|
||||
```
|
||||
gam <UserTypeEntity> show outofoffice
|
||||
(timerange <Time> <Time>)+
|
||||
((date yyyy-mm-dd)|
|
||||
(range yyyy-mm-dd yyyy-mm-dd)|
|
||||
(daily yyyy-mm-dd <Number>)|
|
||||
(weekly yyyy-mm-dd <Number>)|
|
||||
(timerange <Time> <Time>))+
|
||||
[showdayofweek]
|
||||
[formatjson]
|
||||
```
|
||||
@@ -856,6 +893,11 @@ By default, Gam displays the information as an indented list of keys and values.
|
||||
|
||||
```
|
||||
gam <UserTypeEntity> print outofoffice
|
||||
((date yyyy-mm-dd)|
|
||||
(range yyyy-mm-dd yyyy-mm-dd)|
|
||||
(daily yyyy-mm-dd <Number>)|
|
||||
(weekly yyyy-mm-dd <Number>)|
|
||||
(timerange <Time> <Time>))+
|
||||
(timerange <Time> <Time>)+
|
||||
[showdayofweek]
|
||||
[formatjson [quotechar <Character>]] [todrive <ToDriveAttribute>*]
|
||||
@@ -888,7 +930,9 @@ gam <UserTypeEntity> create workinglocation
|
||||
(range yyyy-mm-dd yyyy-mm-dd)|
|
||||
(daily yyyy-mm-dd <Number>)|
|
||||
(weekly yyyy-mm-dd <Number>)|
|
||||
(timerange <Time> <Time>))+
|
||||
(timerange <Time> <Time> (recurrence <RRULE, EXRULE, RDATE and EXDATE line>)*))+
|
||||
[timezone <String>]
|
||||
(noreminders|(reminder email|popup <Number>)+)
|
||||
|
||||
gam <UserTypeEntity> delete workinglocation
|
||||
((date yyyy-mm-dd)|
|
||||
|
||||
@@ -42,13 +42,16 @@
|
||||
editor|freebusy|freebusyreader|owner|reader|writer
|
||||
|
||||
<CalendarSettings> ::=
|
||||
(autoacceptinvitations [<Boolean>])|
|
||||
(description <String>)|
|
||||
(location <String>)|
|
||||
(summary <String>)|
|
||||
(timezone <TimeZone>)
|
||||
|
||||
<CalendarSettingsField> ::=
|
||||
autoacceptinvitations|3
|
||||
conferenceproperties|
|
||||
dataowner|
|
||||
description|
|
||||
id|
|
||||
location|
|
||||
@@ -134,6 +137,7 @@
|
||||
backgroundcolor|
|
||||
colorid|
|
||||
conferenceproperties|
|
||||
dataowner|
|
||||
defaultreminders|
|
||||
deleted|
|
||||
description|
|
||||
@@ -286,11 +290,10 @@ By default, Gam displays the information as an indented list of keys and values.
|
||||
gam <UserTypeEntity> print calendars [todrive <ToDriveAttribute>*]
|
||||
[primary] <CalendarSelectProperty>*
|
||||
[noprimary] [nogroups] [noresources] [nosystem] [nousers]
|
||||
[fields <CalendarListFieldList>] [permissions]
|
||||
[fields <CalendarListFieldList>] [permissions] [oneitemperrow]
|
||||
[formatjson] [delimiter <Character>] [quotechar <Character>]
|
||||
```
|
||||
By default, information for all visible, non-deleted calendars is shown.
|
||||
* `permissions` adds permission information for user owned calendars to the output.
|
||||
* `primary` - Limits the selection to the user's primary calendar
|
||||
* `<CalendarSelectProperty>`
|
||||
* `minaccessrole <CalendarACLRole>`- Limits the selection to those calendars where the user's role is at least `<CalendarACLRole>`
|
||||
@@ -301,6 +304,8 @@ By default, information for all visible, non-deleted calendars is shown.
|
||||
* `noresources` - Do not display resource calendars, email address ends in "@resource.calendar.google.com"
|
||||
* `nosystem` - Do not display system calendars, email address ends in "@group.v.calendar.google.com"
|
||||
* `nousers` - Do not display users calendars, email address ends in `domain` value from `gam.cfg`.
|
||||
* `permissions` Adds permission information for user owned calendars to the output.
|
||||
* `oneitemperrow` - Each permission is output on a separate row with all of the other calendar fields.
|
||||
|
||||
By default, list items are separated by the `csv_output_field_delimiter' from `gam.cfg`.
|
||||
* `delimiter <Character>` - Separate list items with `<Character>`
|
||||
|
||||
@@ -17,18 +17,9 @@
|
||||
- [Display user contact groups](#display-user-contact-groups)
|
||||
|
||||
## Notes
|
||||
As of version `6.08.00`, GAM uses the People API to manage user contacts rather than the Contacts API.
|
||||
GAM 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.
|
||||
|
||||
If you manage contacts in the contact group "Other Contacts", you will need to use an older version,
|
||||
as the People API has very little support for this.
|
||||
|
||||
As of version `6.14.04`, There is now support for managing "Other Contacts".
|
||||
The People API has very little support for managing contacts in the contact group "Other Contacts".
|
||||
|
||||
[Users - People - Contacts & Profiles](Users-People-Contacts-Profiles)
|
||||
|
||||
|
||||
@@ -94,19 +94,10 @@ Show current drive usage.
|
||||
gam redirect stdout ./DrivefileUsage.txt user user@domain.com show drivesettings
|
||||
```
|
||||
Get list of top level files/folders.
|
||||
|
||||
GAM version `6.22.14` and higher:
|
||||
```
|
||||
gam redirect csv ./TopLevelFilesFolders.csv user user@domain.com print filelist select rootid fields id,name,mimetype depth 0
|
||||
```
|
||||
GAM version `6.22.13` and lower.
|
||||
```
|
||||
gam user user@domain.com show fileinfo root fields id
|
||||
User: user@domain.com, Show 1 Drive File/Folder
|
||||
Drive Folder: My Drive (0AENlVEBUkz-hUkWXYZ)
|
||||
id: 0AENlVEBUkz-hUkWXYZ
|
||||
gam redirect csv ./TopLevelFilesFolders.csv user user@domain.com print filelist select 0AENlVEBUkz-hUkWXYZ fields id,name,mimetype depth 0
|
||||
```
|
||||
|
||||
Purge top level files/folders.
|
||||
```
|
||||
gam redirect stdout ./PurgeTopLevelFilesFolders.txt multiprocess redirect stderr stdout csv ./TopLevelFilesFolders.csv gam user "~Owner" purge drivefile "~id"
|
||||
@@ -128,7 +119,6 @@ Show updated drive usage.
|
||||
gam redirect stdout ./DrivefileUsage.txt append user user@domain.com show drivesettings
|
||||
```
|
||||
### Method 3
|
||||
* GAM version `6.30.09` and higher
|
||||
* Generate a list of top level files/folders that a user owns.
|
||||
* Delete them; orphans are not included
|
||||
* Generate a list of remaining file/folders (orphans).
|
||||
|
||||
@@ -26,6 +26,15 @@
|
||||
* [`<UserTypeEntity>`](Collections-of-Users)
|
||||
|
||||
```
|
||||
<CSVFileInput> ::=
|
||||
((<FileName> [charset <Charset>] )|
|
||||
(gsheet <UserGoogleSheet>)|
|
||||
(gdoc <UserGoogleDoc>)|
|
||||
(gcscsv <StorageBucketObjectName>)|
|
||||
(gcsdoc <StorageBucketObjectName>))
|
||||
[warnifnodata] [columndelimiter <Character>] [noescapechar <Boolean>] [quotechar <Character>]
|
||||
[endcsv|(fields <FieldNameList>)]
|
||||
|
||||
<RegularExpression> ::= <String>
|
||||
See: https://docs.python.org/3/library/re.html
|
||||
<REMatchPattern> ::= <RegularExpression>
|
||||
@@ -38,7 +47,8 @@
|
||||
<EmailAddress> ::= <String>@<DomainName>
|
||||
<UniqueID> ::= id:<String>
|
||||
<UserItem> ::= <EmailAddress>|<UniqueID>|<String>
|
||||
|
||||
```
|
||||
```
|
||||
<DriveFileACLRole> ::=
|
||||
manager|organizer|owner|
|
||||
contentmanager|fileorganizer|
|
||||
@@ -114,6 +124,7 @@ gam <UserTypeEntity> copy drivefile <DriveFileEntity>
|
||||
[copysheetprotectedrangesinheritedpermissions [<Boolean>]]
|
||||
[copysheetprotectedrangesnoninheritedpermissions [<Boolean>]]
|
||||
[excludepermissionsfromdomains|includepermissionsfromdomains <DomainNameList>]
|
||||
(mappermissionsemail <EmailAddress> <EmailAddress)* [mappermissionsemailfile <CSVFileInput> endcsv]
|
||||
(mappermissionsdomain <DomainName> <DomainName>)*
|
||||
[sendemailifrequired [<Boolean>]]
|
||||
[verifyorganizer [<Boolean>]]
|
||||
@@ -226,8 +237,6 @@ When a file appears more that once in the copy, the first time the file is proce
|
||||
If it is processed again (because of multiple parents within the source folder structure), a shortcut is created that points to the first copy.
|
||||
|
||||
### Shortcuts
|
||||
In previous versions, copying shortcuts caused an error because shortcuts can't be copied, they must be re-created.
|
||||
|
||||
If a shortcut in the source structure points to a file/folder that is not in the source structure:
|
||||
* The shortcut is re-created to point to the original file/folder.
|
||||
|
||||
@@ -263,7 +272,6 @@ When a folder is copied, its permissions are not copied; these options control c
|
||||
of the form `option [<Boolean>]`; if `<Boolean>` is omitted, `true` is assumed.
|
||||
|
||||
When copied, a target folder inherits the permissions of its parent folder; these options control whether/how GAM copies the existing source folder permissions.
|
||||
The default values of options introduced in version 6.14.00 are set to match the behavior of earlier versions.
|
||||
|
||||
When `mergewithparent` is `true`:
|
||||
* `copymergewithparentfolderpermissions false` - The permissions of the source top folder are not not copied to the target folder; this is the default action.
|
||||
@@ -316,8 +324,14 @@ When `excludepermissionsfromdomains <DomainNameList>` is specified, any ACL that
|
||||
|
||||
When `includepermissionsfromdomains <DomainNameList>` is specified, only ACLs that reference a domain in `<DomainNameList>` will be copied.
|
||||
|
||||
When `mappermissionsemail <EmailAddress> <EmailAddress>` is specifed, an ACL that references the first `<EmailAddress>` will be modified
|
||||
to reference the second `<EmailAddress>` when copied; the original ACL is not modified. The option can be repeated if multiple email addresses are to be mapped.
|
||||
|
||||
Bulk permission email address mapping can be specified with `mappermissionsemailfile <CSVFileInput> endcsv`.
|
||||
`<CSVFileInput>` must include these columns: `sourceEmail` and `destinationEmail`.
|
||||
|
||||
When `mappermissionsdomain <DomainName> <DomainName>` is specified, any ACL that references the first `<DomainName>` will be modified
|
||||
to reference the second `<DomainName>` when copied; the original ACL is not modified. The option can be repeated if multiple domain names are to me mapped.
|
||||
to reference the second `<DomainName>` when copied; the original ACL is not modified. The option can be repeated if multiple domain names are to be mapped.
|
||||
|
||||
When copying an ACL that references a non Google account, an error is generated unless an email is sent to the account;
|
||||
by default, no email notifications are sent. The `sendemailifrequired` options instructs GAM to send an email notification in this case.
|
||||
@@ -352,6 +366,8 @@ Linux/MacOS
|
||||
fileId=$(gam user user@domain.com copy drivefile <DriveFileEntity> ... returnidonly)
|
||||
Windows PowerShell
|
||||
$fileId = & gam user user@domain.com copy drivefile <DriveFileEntity> ... returnidonly
|
||||
Windows Command Prompt
|
||||
for /f "delims=" %a in ('gam user user@domain.com copy drivefile <DriveFileEntity> ... returnidonly') do set fileId=%a
|
||||
```
|
||||
The file ID will only be valid when the return code of the command is 0; program accordingly.
|
||||
|
||||
@@ -388,7 +404,7 @@ gam user user@domain.com copy drivefile root recursive teamdriveparentid <Shared
|
||||
```
|
||||
|
||||
### Copy content of a Shared Drive to another Shared Drive
|
||||
Suppose you have a source Shared Drive called 0AC_1AB with multiple files and folders, and want to copy all of its content to the target Shared Drive 0AE_9ZX.
|
||||
Suppose you have a source Shared Drive with ID 0AC_1AB with multiple files and folders, and want to copy all of its content to the target Shared Drive with ID 0AE_9ZX.
|
||||
|
||||
The following command will copy the content, files and folders inside the source drive recursively, and put them in the target drive.
|
||||
|
||||
@@ -431,6 +447,52 @@ gam user user@domain.com copy drivefile teamdriveid 0AC_1AB teamdriveparentid 0A
|
||||
copyfilenoninheritedpermissions true
|
||||
```
|
||||
|
||||
### Copy content of a source Shared Drive to a target Shared Drive with parallel Processing
|
||||
Suppose you have a source Shared Drive with ID 0AC_1AB with multiple files and folders, and want to copy all of its content to the target Shared Drive with ID 0AE_9ZX.
|
||||
|
||||
Get top level items on source Shared Drive
|
||||
```
|
||||
gam redirect csv ./TopSDItems.csv user user@domain.com print filelist select 0AC_1AB fields id,name,mimetype depth 0
|
||||
```
|
||||
Copy the top level items to target Shared Drive; append desired permission options
|
||||
```
|
||||
gam redirect stdout ./CopySharedDrive.txt multiprocess redirect stderr stdout csv TopSDItems.csv gam user user@domain.com copy drivefile "~id" recursive teamdriveparentid 0AE_9ZX
|
||||
```
|
||||
|
||||
### Copy content of a source Shared Drive folder to a target Shared Drive with parallel Processing
|
||||
Get top level items on source Shared Drive folder with ID 1BX-8W3
|
||||
```
|
||||
gam redirect csv ./TopSDItems.csv user user@domain.com print filelist select 1Bx-8W3 fields id,name,mimetype depth 0
|
||||
```
|
||||
Create a folder on target Shared Drive with ID 0AE_9ZX, replace "New Folder Name" as desired.
|
||||
```
|
||||
gam user user@domain.com create drivefile mimetype gfolder teamdriveparentid 0AE-9ZX drivefilename "New Folder Name" returnidonly
|
||||
```
|
||||
Copy the folder top level items to target Shared Drive folder, assume ID 2CY-45G was returned in previous step
|
||||
```
|
||||
gam redirect stdout ./CopySharedDrive.txt multiprocess redirect stderr stdout csv TopSDItems.csv gam user user@domain.com copy drivefile "~id" recursive teamdriveparentid 2CY-45G
|
||||
```
|
||||
You can script the steps:
|
||||
|
||||
Linux/MacOS
|
||||
```
|
||||
gam redirect csv ./TopSDItems.csv user user@domain.com print filelist select 1Bx-8W3 fields id,name,mimetype depth 0
|
||||
targetFolderId=$(gam user user@domain.com create drivefile mimetype gfolder teamdriveparentid 0AE-9ZX drivefilename "New Folder Name" returnidonly)
|
||||
gam redirect stdout ./CopySharedDrive.txt multiprocess redirect stderr stdout csv TopSDItems.csv gam user user@domain.com copy drivefile "~id" recursive teamdriveparentid $targetFolderId
|
||||
```
|
||||
Windows PowerShell
|
||||
```
|
||||
gam redirect csv ./TopSDItems.csv user user@domain.com print filelist select 1Bx-8W3 fields id,name,mimetype depth 0
|
||||
$targetFolderId = & gam user user@domain.com create drivefile mimetype gfolder teamdriveparentid 0AE-9ZX drivefilename "New Folder Name" returnidonly
|
||||
gam redirect stdout ./CopySharedDrive.txt multiprocess redirect stderr stdout csv TopSDItems.csv gam user user@domain.com copy drivefile "~id" recursive teamdriveparentid $targetFolderId
|
||||
```
|
||||
Windows Command Prompt
|
||||
```
|
||||
gam redirect csv ./TopSDItems.csv user user@domain.com print filelist select 1Bx-8W3 fields id,name,mimetype depth 0
|
||||
for /f "delims=" %a in ('gam user user@domain.com create drivefile mimetype gfolder teamdriveparentid 0AE-9ZX drivefilename "New Folder Name" returnidonly') do set taregtFolderId=%a
|
||||
gam redirect stdout ./CopySharedDrive.txt multiprocess redirect stderr stdout csv TopSDItems.csv gam user user@domain.com copy drivefile "~id" recursive teamdriveparentid %targetFolderId%
|
||||
```
|
||||
|
||||
## Move files and folders
|
||||
## Move My Drive folder to Shared Drive
|
||||
There are two methods for moving a folder from a My Drive to a Shared Drive:
|
||||
@@ -497,8 +559,8 @@ gam <UserTypeEntity> move drivefile <DriveFileEntity> [newfilename <DriveFileNam
|
||||
[copysubfolderinheritedpermissions [<Boolean>]]
|
||||
[copysubfoldernoninheritedpermissions never|always|syncallfolders|syncupdatedfolders]
|
||||
[excludepermissionsfromdomains|includepermissionsfromdomains <DomainNameList>]
|
||||
(mappermissionsemail <EmailAddress> <EmailAddress)* [mappermissionsemailfile <CSVFileInput> endcsv]
|
||||
(mappermissionsdomain <DomainName> <DomainName>)*
|
||||
[updatefilepermissions [<Boolean>]]
|
||||
[retainsourcefolders [<Boolean>]]
|
||||
[sendemailifrequired [<Boolean>]]
|
||||
[verifyorganizer [<Boolean>]]
|
||||
@@ -621,8 +683,14 @@ When `excludepermissionsfromdomains <DomainNameList>` is specified, any ACL that
|
||||
|
||||
When `includepermissionsfromdomains <DomainNameList>` is specified, only ACLs that reference a domain in `<DomainNameList>` will be copied.
|
||||
|
||||
When `mappermissionsemail <EmailAddress> <EmailAddress>` is specifed, an ACL that references the first `<EmailAddress>` will be modified
|
||||
to reference the second `<EmailAddress>` when copied; the original ACL is not modified. The option can be repeated if multiple email addresses are to be mapped.
|
||||
|
||||
Bulk permission email address mapping can ge specified with `mappermissionsemailfile <CSVFileInput> endcsv`.
|
||||
`<CSVFileInput>` must include these columns: `sourceEmail` and `destinationEmail`.
|
||||
|
||||
When `mappermissionsdomain <DomainName> <DomainName>` is specified, any ACL that references the first `<DomainName>` will be modified
|
||||
to reference the second `<DomainName>` when copied; the original ACL is not modified. The option can be repeated if multiple domain names are to me mapped.
|
||||
to reference the second `<DomainName>` when copied; the original ACL is not modified. The option can be repeated if multiple domain names are to be mapped.
|
||||
|
||||
When copying an ACL that references a non Google account, an error is generated unless an email is sent to the account;
|
||||
by default, no email notifications are sent. The `sendemailifrequired` options instructs GAM to send an email notification in this case.
|
||||
@@ -639,8 +707,14 @@ When `excludepermissionsfromdomains <DomainNameList>` is specified, any ACL that
|
||||
|
||||
When `includepermissionsfromdomains <DomainNameList>` is specified, any ACLs that references a domain not in `<DomainNameList>` will be removed.
|
||||
|
||||
When `mappermissionsemail <EmailAddress> <EmailAddress>` is specifed, an ACL that references the first `<EmailAddress>` will be removed;
|
||||
a new ACL with the same properties referencing the second `<EmailAddess>` will be created. The option can be repeated if multiple domain names are to be mapped.
|
||||
|
||||
Bulk email address mapping can ge specified with `mappermissionsemailfile <CSVFileInput> endcsv`.
|
||||
`<CSVFileInput>` must include these columns: `sourceEmail` and `destinationEmail`.
|
||||
|
||||
When `mappermissionsdomain <DomainName> <DomainName>` is specified, any ACL that references the first `<DomainName>` will be removed;
|
||||
a new ACL with the same properties referencing the second `<DomainName>` will be created. The option can be repeated if multiple domain names are to me mapped.
|
||||
a new ACL with the same properties referencing the second `<DomainName>` will be created. The option can be repeated if multiple domain names are to be mapped.
|
||||
|
||||
When creating an ACL that references a non Google account, an error is generated unless an email is sent to the account;
|
||||
by default, no email notifications are sent. The `sendemailifrequired` options instructs GAM to send an email notification in this case.
|
||||
|
||||
@@ -494,9 +494,8 @@ an API call per file is required to get the information.
|
||||
labelsIds: <ClassificationLabelID> <ClassificationLabelID> ...
|
||||
```
|
||||
|
||||
Starting in version 6.27.02, you can get Drive label information without an extra API call
|
||||
if you know the `<ClassificationLabelID>`s. Add `labelinfo` to your `fields` list and use `includelabels <ClassificationLabelIDList>`
|
||||
to specify the Drive labels.
|
||||
You can get Drive label information without an extra API call if you know the `<ClassificationLabelID>`s.
|
||||
Add `labelinfo` to your `fields` list and use `includelabels <ClassificationLabelIDList>` to specify the Drive labels.
|
||||
```
|
||||
gam user user@domain.com show fileinfo <DriveFileEntity> fields id,name,mimetype,labelinfo includelabels "mRoha85IbwCRl490E00xGLvBsSbkwIiuZ6PRNNEbbFcb"
|
||||
```
|
||||
@@ -504,7 +503,7 @@ gam user user@domain.com show fileinfo <DriveFileEntity> fields id,name,mimetype
|
||||
The `stripcrsfromname` option strips nulls, carriage returns and linefeeds from drive file names.
|
||||
Use this option if you discover filenames containing these special characters; it is not common.
|
||||
|
||||
Starting in version 6.80.10, the option `followshortcuts [<Boolean>]` that when true and `<DriveFileEntity` is a shortcut,
|
||||
The option `followshortcuts [<Boolean>]` that when true and `<DriveFileEntity` is a shortcut,
|
||||
causes GAM to display information about the target of the shortcut rather than the shortcut itself.
|
||||
|
||||
By default, Gam displays the information as an indented list of keys and values.
|
||||
@@ -540,7 +539,7 @@ Use this option if you discover filenames containing these special characters; i
|
||||
By default, when printing file paths, all paths for a file are displayed on the same row; use `oneitemperrow` to
|
||||
have each file path displayed on a separate row.
|
||||
|
||||
Starting in version 6.80.10, the option `followshortcuts [<Boolean>]` that when true and `<DriveFileEntity` is a shortcut,
|
||||
The option `followshortcuts [<Boolean>]` that when true and `<DriveFileEntity` is a shortcut,
|
||||
causes GAM to display path information for the target of the shortcut rather than the shortcut itself.
|
||||
|
||||
## Select files for Display file counts, list, tree
|
||||
@@ -1197,7 +1196,7 @@ These options can be used instead of the query options to select a specific fold
|
||||
* `select <DriveFileEntity>` - All files in the selected folder and below are shown.
|
||||
* To select the root folder of My Drive, use its `<DriveFolderID>` obtained by `gam user <UserItem> show fileinfo root id`
|
||||
* `select <IDfrom Above>`
|
||||
* Starting in version 6.22.14, you can select the root folder of My Drive with `rootid`.
|
||||
* You can select the root folder of My Drive with `rootid`.
|
||||
* `select rootid`
|
||||
* `selectsubquery <QueryDriveFile>` - Only the files in the selected folder that match the query are shown.
|
||||
|
||||
@@ -1669,7 +1668,7 @@ There is a final row detailing files and folders in the trash; it is omitted if
|
||||
* `depth` - Always -1
|
||||
* `path` - Trash
|
||||
|
||||
GAM version `6.71.17` added the `depth` column that can be used to filter the depth of the folders displayed.
|
||||
The `depth` column that can be used to filter the depth of the folders displayed.
|
||||
Depth `-1` is the top level folder, depth `0` are its immediate children, depth `2` are the children of depth `1` and so forth.
|
||||
For example to limit the display to the top folder and its immediate children, use `config csv_output_row_filter depth:count<1`.
|
||||
|
||||
@@ -1738,8 +1737,6 @@ user@domain.com,Trash,Trash,True,True,1,1024,0,1,1024,0,-1,Trash
|
||||
```
|
||||
|
||||
## Display files published to the web
|
||||
Ths requires version 6.80.13 or later.
|
||||
|
||||
You can display files published to the web.
|
||||
```
|
||||
# Get the published files
|
||||
|
||||
@@ -225,10 +225,7 @@ If `noduplicate` is specfied, GAM will issue a warning and not perform the creat
|
||||
exists in the parent folder.
|
||||
|
||||
By default, when files are uploaded from local content, they are created with `binary` format, i.e., the data is uploaded
|
||||
without any conversion. Legacy GAM had an option `convert` that was passed to the Drive API v2 that it used.
|
||||
* convert - Whether to convert this file to the corresponding Docs Editors format
|
||||
|
||||
Advanced GAM uses Drive API v3 that doesn't support the `convert` option; it uses the `mimetype` argument to cause conversions.
|
||||
without any conversion; use the `mimetype` argument to cause conversions.
|
||||
* `mimetype gdoc` - Convert the uploaded content to a Google Doc; e.g., convert a Word (.docx) or text (.txt) file to a Google Doc
|
||||
* `mimetype gsheet` - Convert the uploaded content to a Google Sheet; e.g., convert an Excel (.xlsx) or CSV (.csv) file to a Google Sheet
|
||||
* `mimetype gpresentation` - Convert the uploaded content to a Google Slides; e.g., convert a PowerPoint (.pptx) file to a Google Slides
|
||||
@@ -249,6 +246,8 @@ Linux/MacOS
|
||||
fileId=$(gam user user@domain.com create drivefile ... returnidonly)
|
||||
Windows PowerShell
|
||||
$fileId = & gam user user@domain.com create drivefile ... returnidonly
|
||||
Windows Command Prompt
|
||||
for /f "delims=" %a in ('gam user user@domain.com create drivefile ... returnidonly') do set fileId=%a
|
||||
```
|
||||
The file ID will only be valid when the return code of the command is 0; program accordingly.
|
||||
|
||||
@@ -555,6 +554,8 @@ Linux/MacOS
|
||||
fileId=$(gam user user@domain.com update drivefile <DriveFileEntity> copy ... returnidonly)
|
||||
Windows PowerShell
|
||||
$fileId = & gam user user@domain.com update drivefile <DriveFileEntity> copy ... returnidonly
|
||||
Windows Command Prompt
|
||||
for /f "delims=" %a in ('gam user user@domain.com update drivefile <DriveFileEntity> copy ... returnidonly') do set fileId=%a
|
||||
```
|
||||
The file ID will only be valid when the return code of the command is 0; program accordingly.
|
||||
|
||||
@@ -662,7 +663,7 @@ gam <UserTypeEntity> trash drivefile <DriveFileEntity> [shortcutandtarget [<Bool
|
||||
gam <UserTypeEntity> delete|del drivefile <DriveFileEntity> trash [shortcutandtarget [<Boolean>]]
|
||||
```
|
||||
|
||||
Starting in version 6.80.10, the option `shortcutandtarget [<Boolean>]` that when true and `<DriveFileEntity` is a shortcut,
|
||||
The option `shortcutandtarget [<Boolean>]` that when true and `<DriveFileEntity` is a shortcut,
|
||||
causes GAM to process the shortcut and the target of the shortcut.
|
||||
|
||||
## Untrash files
|
||||
@@ -672,7 +673,7 @@ gam <UserTypeEntity> untrash drivefile <DriveFileEntity> [shortcutandtarget [<Bo
|
||||
gam <UserTypeEntity> delete|del drivefile <DriveFileEntity> untrash [shortcutandtarget [<Boolean>]]
|
||||
```
|
||||
|
||||
Starting in version 6.80.10, the option `shortcutandtarget [<Boolean>]` that when true and `<DriveFileEntity` is a shortcut,
|
||||
The option `shortcutandtarget [<Boolean>]` that when true and `<DriveFileEntity` is a shortcut,
|
||||
causes GAM to process the shortcut and the target of the shortcut.
|
||||
|
||||
## Purge files
|
||||
@@ -682,7 +683,7 @@ gam <UserTypeEntity> purge drivefile <DriveFileEntity> [shortcutandtarget [<Bool
|
||||
gam <UserTypeEntity> delete|del drivefile <DriveFileEntity> purge [shortcutandtarget [<Boolean>]]
|
||||
```
|
||||
|
||||
Starting in version 6.80.10, the option `shortcutandtarget [<Boolean>]` that when true and `<DriveFileEntity` is a shortcut,
|
||||
The option `shortcutandtarget [<Boolean>]` that when true and `<DriveFileEntity` is a shortcut,
|
||||
causes GAM to process the shortcut and the target of the shortcut.
|
||||
|
||||
## Download Google Documents as JSON
|
||||
|
||||
@@ -117,25 +117,28 @@ specify `basicpermissions` and additional permission fields, e.g., `permissions.
|
||||
<DriveFileACLRoleList> ::= "<DriveFileACLRole>(,<DriveFileACLRole>)*"
|
||||
<DriveFileACLType> ::= anyone|domain|group|user
|
||||
<DriveFileACLTypeList> ::= "<DriveFileACLType>(,<DriveFileACLType>)*"
|
||||
<DriveFilePermission> ::=
|
||||
anyone|anyonewithlink|
|
||||
user:<EmailAddress>|group:<EmailAddress>|
|
||||
domain:<DomainName>|domainwithlink:<DomainName>;<DriveFileACLRole>
|
||||
<DriveFilePermissionID> ::=
|
||||
anyone|anyonewithlink|id:<String>
|
||||
<DriveFilePermissionIDorEmail> ::=
|
||||
<DriveFilePermissionID>|<EmailAddress>
|
||||
<DriveFilePermissionList> ::=
|
||||
"<DriveFilePermission>(,<DriveFilePermission)*"
|
||||
<DriveFilePermissionIDList> ::=
|
||||
"<DriveFilePermissionID>(,<DriveFilePermissionID>)*"
|
||||
<DriveFilePermissionEntity> ::=
|
||||
<DriveFilePermissionList> |
|
||||
<DriveFilePermissionIDEntity> ::=
|
||||
<DriveFilePermissionIDList> |
|
||||
(json [charset <Charset>] <JSONData>)|(json file <FileName> [charset <Charset>]) |
|
||||
<FileSelector> | <CSVFileSelector> | <CSVkmdSelector> | <CSVDataSelector>
|
||||
See: https://github.com/GAM-team/GAM/wiki/Collections-of-Items
|
||||
<DriveFilePermissionIDEntity> ::=
|
||||
<DriveFilePermissionIDList> |
|
||||
<DriveFilePermission> ::=
|
||||
anyone;<DriveFileACLRole> |
|
||||
anyonewithlink;<DriveFileACLRole> |
|
||||
domain:<DomainName>;<DriveFileACLRole> |
|
||||
domainwithlink:<DomainName>;<DriveFileACLRole> |
|
||||
group:<EmailAddress>;<DriveFileACLRole> |
|
||||
user:<EmailAddress>;<DriveFileACLRole>
|
||||
<DriveFilePermissionList> ::=
|
||||
"<DriveFilePermission>(,<DriveFilePermission)*"
|
||||
<DriveFilePermissionEntity> ::=
|
||||
<DriveFilePermissionList> |
|
||||
(json [charset <Charset>] <JSONData>)|(json file <FileName> [charset <Charset>]) |
|
||||
<FileSelector> | <CSVFileSelector> | <CSVkmdSelector> | <CSVDataSelector>
|
||||
See: https://github.com/GAM-team/GAM/wiki/Collections-of-Items
|
||||
@@ -231,7 +234,6 @@ The option `updatesheetprotectedranges` only applies to items in `<DriveFileEnti
|
||||
* ACLs with role reader or commenter will be removed from existing protected ranges
|
||||
* ACLs with role writer or higher will be added to existing protected ranges
|
||||
|
||||
`
|
||||
`enforceexpansiveaccess` defaults to the value of `gam.cfg/enforce_expansive_access` that controls
|
||||
the ability to update inherited ACLs.
|
||||
* False - Inherited ACLs can be updated
|
||||
@@ -258,7 +260,7 @@ The option `updatesheetprotectedranges` only applies to items in `<DriveFileEnti
|
||||
* ACLs with any role will be removed from existing protected ranges
|
||||
|
||||
`enforceexpansiveaccess` defaults to the value of `gam.cfg/enforce_expansive_access` that controls
|
||||
the ability to delete delete inherited ACLs.
|
||||
the ability to delete inherited ACLs.
|
||||
* False - Inherited ACLs can be deleted
|
||||
* True = Inherited ACLs can not be deleted
|
||||
|
||||
@@ -305,7 +307,7 @@ gam <UserTypeEntity> delete permissions <DriveFileEntity> <DriveFilePermissionID
|
||||
[enforceexpansiveaccess [<Boolean>]]
|
||||
```
|
||||
`enforceexpansiveaccess` defaults to the value of `gam.cfg/enforce_expansive_access` that controls
|
||||
the ability to delete delete inherited ACLs.
|
||||
the ability to delete inherited ACLs.
|
||||
* False - Inherited ACLs can be deleted
|
||||
* True = Inherited ACLs can not be deleted
|
||||
|
||||
|
||||
@@ -72,6 +72,8 @@ Linux/MacOS
|
||||
fileId=$(gam user user@domain.com create drivefileshortcut ... returnidonly)
|
||||
Windows PowerShell
|
||||
$fileId = & gam user user@domain.com create drivefileshortcut ... returnidonly
|
||||
Windows Command Prompt
|
||||
for /f "delims=" %a in ('gam user user@domain.com create drivefileshortcut ... returnidonly') do set fileId=%a
|
||||
```
|
||||
The shortcut ID will only be valid when the return code of the command is 0; program accordingly.
|
||||
|
||||
|
||||
@@ -589,9 +589,9 @@ gam <UserTypeEntity> show messages|threads
|
||||
[labelids <LabelIDList>]
|
||||
[quick|notquick] [max_to_show <Number>] [includespamtrash])|(ids <MessageIDEntity>)
|
||||
[labelmatchpattern <REMatchPattern>] [sendermatchpattern <REMatchPattern>]
|
||||
[countsonly|positivecountsonly] [useronly]
|
||||
[countsonly|positivecountsonly]
|
||||
[headers all|<SMTPHeaderList>] [dateheaderformat iso|rfc2822|<String>] [dateheaderconverttimezone [<Boolean>]]
|
||||
[showlabels] [delimiter <Character>] [showbody] [showhtml] [showdate] [showsize] [showsnippet]
|
||||
[showlabels] [useronly] [delimiter <Character>] [showbody] [showhtml] [showdate] [showsize] [showsnippet]
|
||||
[maxmessagesperthread <Number>]
|
||||
[showattachments [attachmentnamepattern <REMatchPattern>>] [noshowtextplain]]
|
||||
[saveattachments [attachmentnamepattern <REMatchPattern>>]]
|
||||
@@ -601,12 +601,13 @@ gam <UserTypeEntity> print messages|threads [todrive <ToDriveAttribute>*]
|
||||
[labelids <LabelIDList>]
|
||||
[quick|notquick] [max_to_print <Number>] [includespamtrash])|(ids <MessageIDEntity>)
|
||||
[labelmatchpattern <REMatchPattern>] [sendermatchpattern <REMatchPattern>]
|
||||
[countsonly|positivecountsonly] [useronly]
|
||||
[countsonly|positivecountsonly]
|
||||
[headers all|<SMTPHeaderList>] [dateheaderformat iso|rfc2822|<String>] [dateheaderconverttimezone [<Boolean>]]
|
||||
[showlabels] [delimiter <Character>] [showbody] [showhtml] [showdate] [showsize] [showsnippet]
|
||||
[showlabels] [useronly] [delimiter <Character>] [showbody] [showhtml] [showdate] [showsize] [showsnippet]
|
||||
[maxmessagesperthread <Number>]
|
||||
[showattachments [attachmentnamepattern <REMatchPattern>>]]
|
||||
[convertcrnl]
|
||||
(addcsvdata <FieldName> <String>)*
|
||||
```
|
||||
## Display all messages
|
||||
By default, Gam displays all messages.
|
||||
@@ -692,6 +693,7 @@ The `dateheaderconverttimezone [<Boolean>]>` option converts `<SMTPDateHeader>`
|
||||
## Print only options
|
||||
These options are valid with `print`.
|
||||
* `convertcrnl` - In the message body, convert carriage returns to `\r` and newlines to `\n`; the default value is `csv_output_convert_cr_nl` from `gam.cfg`.
|
||||
* `addcsvdata <FieldName> <String>` - Add additional columns of data from the command line to the output
|
||||
|
||||
By default, message attachment information is not displayed.
|
||||
* `showattachments` - Display attachment filename, MIME type and size
|
||||
|
||||
@@ -40,12 +40,12 @@ gam user user@domain.com update serviceaccount
|
||||
<JSONData> ::=
|
||||
(json [charset <Charset>] <String>) | (json file <FileName> [charset <Charset>]) |
|
||||
|
||||
<NoteContent> ::=
|
||||
((text <String>)|
|
||||
(textfile <FileName> [charset <Charset>])|
|
||||
(gdoc <UserGoogleDoc>)|
|
||||
(gcsdoc <StorageBucketObjectName>)|
|
||||
<JSONData>)
|
||||
<KeepNoteContent> ::=
|
||||
(text <String>)|
|
||||
(textfile <FileName> [charset <Charset>])|
|
||||
(gdoc <UserGoogleDoc>)|
|
||||
(gcsdoc <StorageBucketObjectName>)|
|
||||
<JSONData>
|
||||
|
||||
<NotesName> ::= notes/<String>
|
||||
<NotesNameList> ::= "<NotesName>(,<NotesName)*"
|
||||
@@ -84,11 +84,11 @@ you will use wherever `<NotesName>` is required.
|
||||
```
|
||||
gam <UserTypeEntity> create note [title <String>]
|
||||
[missingtextvalue <String>]
|
||||
<NoteContent>
|
||||
<KeepNoteContent>
|
||||
[copyacls [copyowneraswriter]]
|
||||
[compact|formatjson|nodetails]
|
||||
```
|
||||
`<NoteContent>` is the note text, there are four ways to specify it:
|
||||
`<KeepNoteContent>` is the note text, there are four ways to specify it:
|
||||
* `message|textmessage|htmlmessage <String>` - Use `<String>` as the note text
|
||||
* `file|htmlfile <FileName> [charset <Charset>]` - Read the note text from `<FileName>`
|
||||
* `gdoc|ghtml <UserGoogleDoc>` - Read the note text from `<UserGoogleDoc>`
|
||||
|
||||
@@ -22,8 +22,6 @@
|
||||
* [Search Conference Participants](https://developers.google.com/meet/api/reference/rest/v2/conferenceRecords.participants/list)
|
||||
|
||||
## Introduction
|
||||
These features were added in version 6.81.00.
|
||||
|
||||
To use these commands you must add the 'Meet API' to your project and update your service account authorization.
|
||||
```
|
||||
gam update project
|
||||
|
||||
@@ -24,16 +24,9 @@
|
||||
- [Copy User Contacts to another User](#copy-user-contacts-to-another-user)
|
||||
|
||||
## Notes
|
||||
As of version `6.08.00`, GAM uses the People API to manage user contacts rather than the Contacts API.
|
||||
GAM 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.
|
||||
|
||||
If you manage contacts in the contact group "Other Contacts", you will need to use an older version,
|
||||
as the People API has very little support for this.
|
||||
The People API has very little support for managing contacts in the contact group "Other Contacts".
|
||||
|
||||
To use these commands you must add the `People API` to your project and authorize the appropriate scopes:
|
||||
* `Client Access`
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
```
|
||||
gam <UserTypeEntity> update photo
|
||||
```
|
||||
* The default file is named `#email#.#ext#` in the current working directory.
|
||||
* The default file is named `#email#.jpg` in the current working directory.
|
||||
* `#email#` will be replaced by the user's full email address
|
||||
|
||||
## Upload a user's photo specifying file name
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
- [Display Shared Drive Counts](#display-shared-drive-counts)
|
||||
- [Display Shared Drive Organizers](#display-shared-drive-organizers)
|
||||
- [Manage Shared Drive access](#manage-shared-drive-access)
|
||||
- [Transfer Shared Drive access](#transfer-shared-drive-access)
|
||||
- [Display Shared Drive access](#display-shared-drive-access)
|
||||
- [Display Shared Drive access for specific Shared Drives](#display-shared-drive-access-for-specific-shared-drives)
|
||||
- [Display Shared Drive access for selected Shared Drives](#display-shared-drive-access-for-selected-shared-drives)
|
||||
@@ -72,6 +73,15 @@
|
||||
<ColorValue> ::= <ColorName>|<ColorHex>
|
||||
```
|
||||
```
|
||||
<CSVFileInput> ::=
|
||||
((<FileName> [charset <Charset>] )|
|
||||
(gsheet <UserGoogleSheet>)|
|
||||
(gdoc <UserGoogleDoc>)|
|
||||
(gcscsv <StorageBucketObjectName>)|
|
||||
(gcsdoc <StorageBucketObjectName>))
|
||||
[warnifnodata] [columndelimiter <Character>] [noescapechar <Boolean>] [quotechar <Character>]
|
||||
[endcsv|(fields <FieldNameList>)]
|
||||
|
||||
<JSONData> ::= (json [charset <Charset>] <String>) | (json file <FileName> [charset <Charset>]) |
|
||||
|
||||
<OrganizerType> ::= user|group
|
||||
@@ -86,7 +96,8 @@
|
||||
<REMatchPattern> ::= <RegularExpression>
|
||||
<RESearchPattern> ::= <RegularExpression>
|
||||
<RESubstitution> ::= <String>>
|
||||
|
||||
```
|
||||
```
|
||||
<DriveFileOrderByFieldName> ::=
|
||||
createddate|createdtime|
|
||||
folder|
|
||||
@@ -283,6 +294,8 @@ Linux/MacOS
|
||||
teamDriveId=$(gam user user@domain.com create shareddrive ... returnidonly)
|
||||
Windows PowerShell
|
||||
$teamDriveId = & gam user user@domain.com create shareddrive ... returnidonly
|
||||
Windows Command Prompt
|
||||
for /f "delims=" %a in ('gam user user@domain.com create shareddrive ... returnidonly') do set teamDriveId=%a
|
||||
```
|
||||
|
||||
## Bulk Create Shared Drives
|
||||
@@ -425,9 +438,11 @@ The `Getting` and `Got` messages are written to stderr, the count is writtem to
|
||||
To retrieve the count with `showitemcountonly`:
|
||||
```
|
||||
Linux/MacOS
|
||||
count=$(gam user user@domain.com print shareddrives showitemcountonly)
|
||||
count=$(gam user user@domain.com print shareddrives ... showitemcountonly)
|
||||
Windows PowerShell
|
||||
count = & gam user user@domain.com print shareddrives showitemcountonly
|
||||
$count = & gam user user@domain.com print shareddrives ... showitemcountonly
|
||||
Windows Command Prompt
|
||||
for /f "delims=" %a in ('gam user user@domain.com print shareddrives ... showitemcountonly') do set count=%a
|
||||
```
|
||||
## Display Shared Drive Organizers
|
||||
The following command can be used instead of the `GetTeamDriveOrganizers.py` script.
|
||||
@@ -512,6 +527,40 @@ When adding permissions from JSON data, permissions with `deleted` true are neve
|
||||
|
||||
When deleting permissions from JSON data, permissions with role `owner` true are never processed.
|
||||
|
||||
## Transfer Shared Drive access
|
||||
These commands are used to transfer ACLs from one Shared Drive to another.
|
||||
* `copy` - Copy all ACLs from the source Shared Drive to the target Shared Drive. The role of an existing ACL in the target Shared Drive will never be reduced.
|
||||
* `sync` - Add/delete/update ACLs in the target Shared Drive to match those in the source Shared Drive.
|
||||
|
||||
* `adminaccess|asadmin` specified - All Shared Drives must be in the same workspace as `<UserTypeEntity>`.
|
||||
* `adminaccess|asadmin` not specified - Shared Drives can be in separate workspaces if `<UserTypeEntity>` in a manager of all of them.
|
||||
```
|
||||
gam <UserTypeEntity> copy shareddriveacls <SharedDriveEntity> to <SharedDriveEntity>
|
||||
[showpermissionsmessages [<Boolean>]]
|
||||
[excludepermissionsfromdomains|includepermissionsfromdomains <DomainNameList>]
|
||||
(mappermissionsemail <EmailAddress> <EmailAddress)* [mappermissionsemailfile <CSVFileInput> endcsv]
|
||||
(mappermissionsdomain <DomainName> <DomainName>)*
|
||||
[adminaccess|asadmin]
|
||||
gam <UserTypeEntity> sync shareddriveacls <SharedDriveEntity> with <SharedDriveEntity>
|
||||
[showpermissionsmessages [<Boolean>]]
|
||||
[excludepermissionsfromdomains|includepermissionsfromdomains <DomainNameList>]
|
||||
(mappermissionsemail <EmailAddress> <EmailAddress)* [mappermissionsemailfile <CSVFileInput> endcsv]
|
||||
(mappermissionsdomain <DomainName> <DomainName>)*
|
||||
[adminaccess|asadmin]
|
||||
```
|
||||
When `excludepermissionsfromdomains <DomainNameList>` is specified, any ACL that references a domain in `<DomainNameList>` will not be copied.
|
||||
|
||||
When `includepermissionsfromdomains <DomainNameList>` is specified, only ACLs that reference a domain in `<DomainNameList>` will be copied.
|
||||
|
||||
When `mappermissionsemail <EmailAddress> <EmailAddress>` is specifed, an ACL that references the first `<EmailAddress>` will be modified
|
||||
to reference the second `<EmailAddress>` when copied; the original ACL is not modified. The option can be repeated if multiple email addresses are to be mapped.
|
||||
|
||||
Bulk permission email address mapping can be specified with `mappermissionsemailfile <CSVFileInput> endcsv`.
|
||||
`<CSVFileInput>` must include these columns: `sourceEmail` and `destinationEmail`.
|
||||
|
||||
When `mappermissionsdomain <DomainName> <DomainName>` is specifed, any ACL that references the first `<DomainName>` will be modified
|
||||
to reference the second `<DomainName>` when copied; the original ACL is not modified. The option can be repeated if multiple domain names are to be mapped.
|
||||
|
||||
## Display Shared Drive access
|
||||
|
||||
These commands are used to display the ACLs on Shared Drives themselves, not the files/folders on the Shared Drives.
|
||||
@@ -603,8 +652,6 @@ gam redirect stdout ./AddU2SharedDriveAccess.txt multiprocess redirect stderr st
|
||||
```
|
||||
|
||||
## Bulk change User1 Shared Drive access to User2
|
||||
This requires GAM version 6.79.09 or higher.
|
||||
|
||||
Make a CSV file Users.csv with two email address columns: User,Replace
|
||||
```
|
||||
# Get Shared Drives for all Users in CSV file
|
||||
|
||||
@@ -231,6 +231,11 @@ When specifying a `<UserMultiAttribute>` you have to specify all instances; ther
|
||||
|
||||
You can remove all instances of a `<UserMultiAttribute>` with `<UserClearAttribute>`.
|
||||
```
|
||||
<UserNoteContent> ::=
|
||||
<String>|
|
||||
(file|textfile|htmlfile <FileName> [charset <Charset>])|
|
||||
(gdoc|ghtml <UserGoogleDoc>)
|
||||
|
||||
<UserBasicAttribute> ::=
|
||||
(archive|archived <Boolean>)|
|
||||
(changepassword|changepasswordatnextlogin <Boolean>)|
|
||||
@@ -244,9 +249,7 @@ You can remove all instances of a `<UserMultiAttribute>` with `<UserClearAttribu
|
||||
(ipwhitelisted <Boolean>)|
|
||||
(language clear|<LanguageList>)|
|
||||
(lastname|familyname <String>)|
|
||||
(note clear|([text_html|text_plain] <String>|
|
||||
(file|htmlfile <FileName> [charset <Charset>])|
|
||||
(gdoc|ghtml <UserGoogleDoc>)))|
|
||||
(note clear|([text_html|text_plain] <UserNoteContent>))|
|
||||
(org|ou|orgunitpath <OrgUnitPath>|<OrgUnitID>)
|
||||
(password (random [<Integer>])|(uniquerandom [<Integer>])|
|
||||
blocklogin|
|
||||
@@ -993,11 +996,9 @@ gam <UserTypeEntity> info users
|
||||
For `info users`, unlike all other GAM commands, a `<UserTypeEntity>` value of `all users` is actually `all users_ns_susp` not `all users_ns`.
|
||||
This is a backwards compatibility issue.
|
||||
|
||||
Starting in version `5.23.01`, the variable `quick_info_user` was added to `gam.cfg` to control how much information requiring additional API calls is displayed.
|
||||
(Prior to version `5.23.01`, assume `quick_info_user = False`.)
|
||||
The variable `quick_info_user` was added to `gam.cfg` controls how much information requiring additional API calls is displayed.
|
||||
|
||||
`quick_info_user = False`: Gam makes additional API calls to get more information; you can selectively eliminate these calls to improve performance.
|
||||
|
||||
* `noaliases` - Do not get alias information
|
||||
* `nobuildingnames` - Do not get building names for locations
|
||||
* `nogroups` - Do not get group membership information
|
||||
@@ -1341,8 +1342,11 @@ To retrieve the count with `showitemcountonly`:
|
||||
Linux/MacOS
|
||||
count=$(gam print users query "orgUnitPath='/Students/Middle School'" showitemcountonly)
|
||||
Windows PowerShell
|
||||
count = & gam print users query "orgUnitPath='/Students/Middle School'" showitemcountonly
|
||||
$count = & gam print users query "orgUnitPath='/Students/Middle School'" showitemcountonly
|
||||
Windows Command Prompt
|
||||
for /f "delims=" %a in ('gam print users query "orgUnitPath='/Students/Middle School'" showitemcountonly') do set count=%a
|
||||
```
|
||||
|
||||
## Verify domain membership
|
||||
You have a CSV file of email addresses and want to verify of the addresses are valid users in your domain.
|
||||
```
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
# Using GAM7 with a YubiKey
|
||||
- [Thanks](#thanks)
|
||||
- [Yubikey ykman PIV Commands](https://docs.yubico.com/software/yubikey/tools/ykman/PIV_Commands.html)
|
||||
- [Introduction](#introduction)
|
||||
- [FAQs](#faqs)
|
||||
@@ -7,15 +6,9 @@
|
||||
|
||||
**Alternative Approach**: For enhanced security and simplified operations when running GAM outside Google Cloud, consider [Workload Identity Federation](https://github.com/GAM-team/GAM/wiki/Using-GAM7-with-keyless-authentication-Workload-Identity-Federation) - Google's recommended keyless authentication method that eliminates the need for managing any long-lived credentials. If running GAM in Google Cloud, use [attached service accounts on GCE](https://github.com/GAM-team/GAM/wiki/Running-GAM7-securely-on-a-Google-Compute-Engine) instead.
|
||||
|
||||
## Thanks
|
||||
|
||||
Thanks to Jay Lee for the original version of this document.
|
||||
|
||||
## Introduction
|
||||
GAM7 supports using a [YubiKey](https://www.yubico.com/products/yubikey-5-overview/) to generate and store the service account's private RSA key. Private keys generated by the YubiKey cannot be exported even to the computer running GAM7. When compared to the plain text oauth2service.json file with the private key stored in text, the YubiKey offers a more secure option that prevents digital theft and copying of the private key. Instead of reading the private key from the oauth2service.json file and signing requests itself, GAM7 will simply send signing requests to the YubiKey and get back the signature.
|
||||
|
||||
GAM7 version 6.50.01 or higher is required. Best practice is to always use the [latest version of GAM7](https://github.com/GAM-team/GAM/wiki/How-to-Update-Advanced-GAM).
|
||||
|
||||
## FAQs
|
||||
### Can I use a Google Titan or other brand security key?
|
||||
No, while Titan keys are great as security keys / U2F / 2SV, that is not the protocol being used by GAM7 here. GAM7 uses the PIV app of YubiKeys to work with service accounts. You need to use [a genuine Yubikey.](https://yubico.com/genuine/).
|
||||
@@ -36,23 +29,32 @@ No, because the YubiKey generated the private key it cannot be digitally exporte
|
||||
When using domain-wide delegation with GAM7, the service account and anyone possessing the service account private key oauth2service.json file has access to the Gmail, Drive and Calendar data of ALL Workspace users in your domain. For this reason, whether using a YubiKey or not, you should take strong measures to protect the service account private key.
|
||||
|
||||
## Setup Steps
|
||||
1. Upgrade to at least GAM7 6.50.01.
|
||||
2. **If you are using a new YubiKey or don't care about the PIV app data on the YubiKey**
|
||||
1. Tell GAM7 to reset and configure the PIV app data on the YubiKey. This wipes all existing keys and configuration and then configures a private key and PIN for GAM7.
|
||||
|
||||
1. Upgrade to the [latest version of GAM7](https://github.com/GAM-team/GAM/wiki/How-to-Update-GAM7).
|
||||
|
||||
2. If you are using a new YubiKey or don't care about the PIV app data on the YubiKey:
|
||||
|
||||
a. Tell GAM7 to reset and configure the PIV app data on the YubiKey. This wipes all existing keys and configuration and then configures a private key and PIN for GAM7.
|
||||
|
||||
* Single YubiKey - `gam yubikey reset_piv`
|
||||
|
||||
* Multiple YubiKeys - `gam yubikey reset_piv yubikeyserialnumber <Number>`
|
||||
2. During the PIV reset, GAM7 will print out a PIN for the private key, record this key.
|
||||
4. **If you are already using the YubiKey and wish to preserve the PIV app data and keys**
|
||||
1. You need to configure one of the PIV slots for a private key GAM7 can use.
|
||||
|
||||
b. During the PIV reset, GAM7 will print out a PIN for the private key, record this key.
|
||||
|
||||
3. OR if you are already using the YubiKey and wish to preserve the PIV app data and keys
|
||||
|
||||
a. You need to configure one of the PIV slots for a private key GAM7 can use.
|
||||
* [ykman piv keys generate](https://docs.yubico.com/software/yubikey/tools/ykman/PIV_Commands.html#ykman-piv-keys-options-command-args)
|
||||
`ykman piv keys generate -P <Text> --pin-policy ALWAYS --touch-policy NEVER --algorithm RSA2048 9a new_pubkey.txt`
|
||||
* Use `9a` for the `AUTHENTICATION` slot, `9c` for the `SIGNATURE` slot
|
||||
2. You need to generate a certificate for that slot.
|
||||
|
||||
b. You need to generate a certificate for that slot.
|
||||
* [ykman piv certificates generate](https://docs.yubico.com/software/yubikey/tools/ykman/PIV_Commands.html#ykman-piv-certificates-generate-options-slot-public-key)
|
||||
`ykman piv certificates generate -P <Text> --subject "GAM Service Account" -d 36500 9a new_pubkey.txt`
|
||||
* Use `9a` for the `AUTHENTICATION` slot, `9c` for the `SIGNATURE` slot
|
||||
|
||||
5. Now that you have a private key on your YubiKey, tell GAM7 to use that instead of the private_key stored in oauth2service.json. We can do that by rotating the key:
|
||||
4. Now that you have a private key on your YubiKey, tell GAM7 to use that instead of the private_key stored in oauth2service.json. We can do that by rotating the key:
|
||||
```
|
||||
copy oauth2service.json to oauth2service.save
|
||||
gam create sakey yubikey yubikey_pin yubikey_slot AUTHENTICATION|SIGNATURE
|
||||
@@ -65,10 +67,10 @@ copy oauth2service.json to oauth2service.yk
|
||||
copy oauth2service.save to oauth2service.json
|
||||
```
|
||||
|
||||
6. Now you should be able to run GAM7 commands like:
|
||||
5. Now you should be able to run GAM7 commands like:
|
||||
```
|
||||
gam user admin@example.com check serviceaccount
|
||||
```
|
||||
and see the YubiKey lights flash as the YubiKey interacts with GAM7 to sign the GAM7 authentication requests. If you look at the oauth2service.json file, you'll see it contains some new fields like yubikey_serial and yubikey_pin but no longer contains the private_key field where GAM7 would normally store the private key data.
|
||||
|
||||
7. As a last step, since YubiKey-stored private keys do not need to be and should not be rotated, you can remove the service account's permissions to change it's own key. Navigate to the [Cloud Console](https://console.cloud.google.com/iam-admin/serviceaccounts) select the correct project and service account and on the Permissions tab, edit and remove the "Service Account Key Admin" permission that the service account has to itself.
|
||||
6. As a last step, since YubiKey-stored private keys do not need to be and should not be rotated, you can remove the service account's permissions to change it's own key. Navigate to the [Cloud Console](https://console.cloud.google.com/iam-admin/serviceaccounts) select the correct project and service account and on the Permissions tab, edit and remove the "Service Account Key Admin" permission that the service account has to itself.
|
||||
|
||||
@@ -24,7 +24,7 @@ Not all Google Admin APIs work with DASA right no:
|
||||
* GAM7 support for DASA is still experimental and some things may fail. Please report your findings to the [GAM group](https://groups.google.com/g/google-apps-manager).
|
||||
|
||||
## Setup Steps
|
||||
1. Upgrade to at least GAM7 6.50.00. Best practice is to always use the [latest version of GAM7](https://github.com/GAM-team/GAM/wiki/How-to-Update-Advanced-GAM).
|
||||
1. Upgrade to the [latest version of GAM7](https://github.com/GAM-team/GAM/wiki/How-to-Update-GAM7).
|
||||
|
||||
2. Follow the steps in `gam create project` up to the point where you are presented with a URL to the Cloud console to create a Client ID and secret. You don’t need to enter anything those, just press CTRL+C to quit the project creation.
|
||||
|
||||
|
||||
@@ -487,10 +487,8 @@ Alternatively, `<FileName>` can contain the strings `#objectname#`, `#filename#`
|
||||
and `#extension#` which will be replaced by the values from the original object names to construct a complete top level name.
|
||||
For example, `targetname "#filename#.#extension#"` strips the long matter name from the original name.
|
||||
|
||||
**In versions prior to 6.07.14, If `<FileName>` does not contain `#filename#` and there are multiple top level files with the same extension, only the
|
||||
last file with a given extension will be saved as the earlier files will be overwritten.**
|
||||
|
||||
This is fixed in 6.07.14: the files will be named `FileName-N.ext` where `N` is `1,2,3,...`.
|
||||
If `<FileName>` does not contain `#filename#` and there are multiple top level files with the same extension,
|
||||
the files will be named `FileName-N.ext` where `N` is `1,2,3,...`.
|
||||
|
||||
Zip files extracted from the top level Zip file will still have their long names.
|
||||
|
||||
@@ -584,7 +582,6 @@ done < user1@domain.com-vault-files.csv
|
||||
Why would you want to download files one by one when GAM can download all Cloud Storage objects in one go? Because all of the files combined **might** take up a lot of space (think Terabytes in case of a Drive export of many years) whereas individually, each file will be in a much more manageable ~10 Gigabyte range.
|
||||
|
||||
## Copy Vault Exports
|
||||
Many thanks to Jay for this command and documentation.
|
||||
```
|
||||
gam copy vaultexport|export <ExportItem> matter <MatterItem>
|
||||
[targetbucket <String>] [targetprefix <String>]
|
||||
@@ -929,9 +926,8 @@ Select fields to display:
|
||||
The `shownames` argument controls whether org unit and shared drive names are displayed in queries; additional API calls are required to get the names.
|
||||
|
||||
## Takeout
|
||||
Many thanks to Jay for these commands and documentation.
|
||||
|
||||
GAM 6.42.00 and newer support copying and downloading Google Cloud Storage (GCS) buckets generated by [organization-wide Takeout](https://support.google.com/a/answer/100458?hl=en).
|
||||
GAM supports copying and downloading Google Cloud Storage (GCS) buckets generated by [organization-wide Takeout](https://support.google.com/a/answer/100458?hl=en).
|
||||
Once the Takeout completes you need to copy the name of the GCS bucket and provide it to GAM.
|
||||
|
||||
## Copy a Takeout Bucket
|
||||
|
||||
@@ -3,10 +3,10 @@
|
||||
Print the current version of Gam with details
|
||||
```
|
||||
gam version
|
||||
GAM 7.27.05 - https://github.com/GAM-team/GAM - pyinstaller
|
||||
GAM 7.30.03 - https://github.com/GAM-team/GAM - pyinstaller
|
||||
GAM Team <google-apps-manager@googlegroups.com>
|
||||
Python 3.14.0 64-bit final
|
||||
macOS Tahoe 26.0.1 x86_64
|
||||
Python 3.14.2 64-bit final
|
||||
macOS Tahoe 26.1 x86_64
|
||||
Path: /Users/Admin/bin/gam7
|
||||
Config File: /Users/admin/GAMConfig/gam.cfg, Section: DEFAULT, customer_id: my_customer, domain: domain.com
|
||||
Time: 2023-06-02T21:10:00-07:00
|
||||
@@ -15,10 +15,10 @@ Time: 2023-06-02T21:10:00-07:00
|
||||
Print the current version of Gam with details and time offset information
|
||||
```
|
||||
gam version timeoffset
|
||||
GAM 7.27.05 - https://github.com/GAM-team/GAM - pyinstaller
|
||||
GAM 7.30.03 - https://github.com/GAM-team/GAM - pyinstaller
|
||||
GAM Team <google-apps-manager@googlegroups.com>
|
||||
Python 3.14.0 64-bit final
|
||||
macOS Tahoe 26.0.1 x86_64
|
||||
Python 3.14.2 64-bit final
|
||||
macOS Tahoe 26.1 x86_64
|
||||
Path: /Users/Admin/bin/gam7
|
||||
Config File: /Users/admin/GAMConfig/gam.cfg, Section: DEFAULT, customer_id: my_customer, domain: domain.com
|
||||
Your system time differs from www.googleapis.com by less than 1 second
|
||||
@@ -27,10 +27,10 @@ Your system time differs from www.googleapis.com by less than 1 second
|
||||
Print the current version of Gam with extended details and SSL information
|
||||
```
|
||||
gam version extended
|
||||
GAM 7.27.05 - https://github.com/GAM-team/GAM - pyinstaller
|
||||
GAM 7.30.03 - https://github.com/GAM-team/GAM - pyinstaller
|
||||
GAM Team <google-apps-manager@googlegroups.com>
|
||||
Python 3.14.0 64-bit final
|
||||
macOS Tahoe 26.0.1 x86_64
|
||||
Python 3.14.2 64-bit final
|
||||
macOS Tahoe 26.1 x86_64
|
||||
Path: /Users/Admin/bin/gam7
|
||||
Config File: /Users/admin/GAMConfig/gam.cfg, Section: DEFAULT, customer_id: my_customer, domain: domain.com
|
||||
Time: 2023-06-02T21:10:00-07:00
|
||||
@@ -68,7 +68,7 @@ MacOS High Sierra 10.13.6 x86_64
|
||||
Path: /Users/Admin/bin/gam7
|
||||
Version Check:
|
||||
Current: 5.35.08
|
||||
Latest: 7.27.05
|
||||
Latest: 7.30.03
|
||||
echo $?
|
||||
1
|
||||
```
|
||||
@@ -76,7 +76,7 @@ echo $?
|
||||
Print the current version number without details
|
||||
```
|
||||
gam version simple
|
||||
7.27.05
|
||||
7.30.03
|
||||
```
|
||||
In Linux/MacOS you can do:
|
||||
```
|
||||
@@ -86,10 +86,10 @@ echo $VER
|
||||
Print the current version of Gam and address of this Wiki
|
||||
```
|
||||
gam help
|
||||
GAM 7.27.05 - https://github.com/GAM-team/GAM
|
||||
GAM 7.30.03 - https://github.com/GAM-team/GAM
|
||||
GAM Team <google-apps-manager@googlegroups.com>
|
||||
Python 3.14.0 64-bit final
|
||||
macOS Tahoe 26.0.1 x86_64
|
||||
Python 3.14.2 64-bit final
|
||||
macOS Tahoe 26.1 x86_64
|
||||
Path: /Users/Admin/bin/gam7
|
||||
Config File: /Users/admin/GAMConfig/gam.cfg, Section: DEFAULT, customer_id: my_customer, domain: domain.com
|
||||
Time: 2023-06-02T21:10:00-07:00
|
||||
|
||||
@@ -75,6 +75,7 @@ Client Access
|
||||
* [Calendars - Events](Calendars-Events)
|
||||
* [Chrome Auto Update Expiration Counts](Chrome-AUE-Counts)
|
||||
* [Chrome Browser Cloud Management](Chrome-Browser-Cloud-Management)
|
||||
* [Chrome Device Counts](Chrome-Device-Counts)
|
||||
* [Chrome Device Needs Attention Counts](Chrome-Needs-Attention-Counts)
|
||||
* [Chrome Installed Apps](Chrome-Installed-Apps)
|
||||
* [Chrome Policies](Chrome-Policies)
|
||||
|
||||
1
wiki/foo.lst
Normal file
1
wiki/foo.lst
Normal file
@@ -0,0 +1 @@
|
||||
ChromeOS-Devices.md Classroom-Courses.md Classroom-Membership.md Classroom-StudentGroups.md Cloud-Identity-Devices.md Cloud-Identity-Groups.md Domains.md GamUpdates.md Groups.md Mobile-Devices.md Organizational-Units.md Resources.md Shared-Drives.md Users-Shared-Drives.md Users.md
|
||||
@@ -2,6 +2,7 @@
|
||||
- [Introduction](#introduction)
|
||||
- [Variables](#variables)
|
||||
- [Multiple Computers](#multiple-computers)
|
||||
- [Separate Staff-Student Domains](#separate-staff-student-domains)
|
||||
- [Multiple Customers and Domains](#multiple-customers-and-domains)
|
||||
- [Multiple Users-Projects on One Computer](#multiple-users-projects-on-one-computer)
|
||||
|
||||
@@ -289,8 +290,6 @@ csv_output_timestamp_column
|
||||
csv_output_users_audit
|
||||
Gam print commands that print objects belonging to users
|
||||
don't print rows for users that don't have any of the objects.
|
||||
The objects are: calendars, calendar ACLs, calendar events, delegates, filters,
|
||||
forwarding addresses, sendas addresses, S/MIME certificates and tokens.
|
||||
When csv_output_users_audit is true, a placeholder row will be output with the
|
||||
user's email address; these rows will useful for auditing purposes only,
|
||||
they can not be successfuly used in a gam csv command.
|
||||
@@ -316,7 +315,7 @@ domain
|
||||
Default: Blank
|
||||
Environment variable: GA_DOMAIN
|
||||
drive_dir
|
||||
Directory for get drivefile and CSV files
|
||||
Output directory for files with non-absolute file names.
|
||||
Default: ~/Downloads
|
||||
Environment variable: GAMDRIVEDIR
|
||||
drive_max_results
|
||||
@@ -366,6 +365,10 @@ gmail_cse_incert_dir
|
||||
gmail_cse_inkey_dir
|
||||
Directory for the Key Access Control List (KACL) wrapped private key data files used by Gmail Client Side Encryption.
|
||||
Default: Blank
|
||||
input_dir
|
||||
Input directory for files with non-absolute file names.
|
||||
The default
|
||||
Default: .
|
||||
inter_batch_wait
|
||||
When processing items in batches, how many seconds should GAM wait between batches
|
||||
Default: 0
|
||||
@@ -564,10 +567,10 @@ timezone
|
||||
to your local timezone. If you are running GAM on a remote computer or on a
|
||||
cloud shell, "local" will mean the time at the remote/cloud shell computer,
|
||||
not your location, Use "+|-hh:mm" to specify the timezone at your location.
|
||||
Starting with version 7.21.00 you can use a timezone name.
|
||||
Starting with version 7.21.00 you can use a timezone name; the names are case sensitive.
|
||||
See: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
|
||||
Default: utc
|
||||
Range: utc|z|local|(+|-hh:mm)I<ValidTimezoneName>
|
||||
Range: utc|z|local|(+|-hh:mm)|<ValidTimezoneName>
|
||||
tls_max_version
|
||||
Allowed values: '', tlsv1_2, tlsv1.2, tlsv1_3, tlsv1.3
|
||||
The maximum TLS version to use in https connections
|
||||
@@ -621,7 +624,7 @@ todrive_timeformat
|
||||
Default: '' which selects an ISO format timestamp
|
||||
Example: %Y-%m-%dT%H:%M:%S will display as 2020-07-06T17:48:54
|
||||
todrive_timezone
|
||||
The Spreadsheet settings Timezone value.
|
||||
The Spreadsheet settings Timezone value; the values are case sensitive.
|
||||
See: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
|
||||
Default: ''
|
||||
todrive_upload_nodata
|
||||
@@ -816,6 +819,26 @@ Edit `gam.cfg` on the other computer
|
||||
* config_dir
|
||||
* drive_dir
|
||||
|
||||
## Separate Staff-Student Domains
|
||||
Suppose you have a single workspace with separate staff and student domains; e.g., school.org and students.school.org.
|
||||
You can simplifiy typing email addresses by making two sections.
|
||||
|
||||
```
|
||||
[DEFAULT]
|
||||
customer_id = C1234567
|
||||
[staff]
|
||||
domain = school.org
|
||||
[students]
|
||||
domain = students.school.org
|
||||
```
|
||||
To issue commands about staff users, do: `gam config staff save`
|
||||
Subsequent commands can omit `@school.org` from email addresses, GAM will supply `@school.org`.
|
||||
|
||||
To issue commands about student users, do: `gam config students save`
|
||||
Subsequent commands can omit `@students.school.org` from email addresses, GAM will supply `@students.school.org`.
|
||||
|
||||
You can always type a complete email address if desired.
|
||||
|
||||
## Multiple Customers and Domains
|
||||
There are four arguments to GAM that should simplify how you use GAM with multiple clients/domains.
|
||||
Each client/domain will have a section in gam.cfg that sets the values specific to it.
|
||||
|
||||
Reference in New Issue
Block a user