Posted on 07-29-2014 07:40 AM
Hey y'all, a query for the hive mind.
We've been running into users installing Awesome Screenshots (horrible name), which beacons out to websites tens of thousands of times a day. As you can imagine, InfoSec is not happy about it. I'm trying to find a way to do reporting to find out what extensions are installed on machines.
I found that the extensions are all stored in the same folder:
~/Library/Application Support/Google/Chrome/Default/Extensions/
But the names of the folders with are just random strings of letters and numbers:
external image link
Within the folder is a manifest.json file, which does have the app name in it:
external image link
So I'm assuming there is some way to grab that and throw it into an extension attribute or something. I think the main problem would be navigating through those extension folders, or at least finding a way to translate those folders into extension names.
Has anyone found a way to successfully report installed extensions? Any input on this would be appreciated. Thanks!
Solved! Go to Solution.
Posted on 07-29-2014 11:53 AM
Managed to figure it out. Here's an example using Awesome Screenshot:
#!/bin/sh
#
# script by emily k 2014-07-29
# to detect if the Awesome Screenshot Extension is installed on Google Chrome
#
currentUser=`ls -l /dev/console | cut -d " " -f 4`
if [ -d "/Users/$currentUser/Library/Application Support/Google/Chrome/Default/Extensions/alelhddbbhepgpmgidjdcjakblofbmce" ] ; then
STATUS="Awesome Screenshot Installed."
else
STATUS="Not installed."
fi
echo "<result>$STATUS</result>"
You can then scope/create smart groups/etc.
More on setting up the EA http://www.modtitan.com/2014/07/detecting-installed-chrome-extensions.html.
Posted on 07-29-2014 11:53 AM
Managed to figure it out. Here's an example using Awesome Screenshot:
#!/bin/sh
#
# script by emily k 2014-07-29
# to detect if the Awesome Screenshot Extension is installed on Google Chrome
#
currentUser=`ls -l /dev/console | cut -d " " -f 4`
if [ -d "/Users/$currentUser/Library/Application Support/Google/Chrome/Default/Extensions/alelhddbbhepgpmgidjdcjakblofbmce" ] ; then
STATUS="Awesome Screenshot Installed."
else
STATUS="Not installed."
fi
echo "<result>$STATUS</result>"
You can then scope/create smart groups/etc.
More on setting up the EA http://www.modtitan.com/2014/07/detecting-installed-chrome-extensions.html.
Posted on 07-31-2014 07:35 AM
currentUser=ls -l /dev/console | cut -d " " -f 4
rm -rf /Users/$currentUser/Library/Application Support/Google/Chrome/Default/Extensions/*
chmod 000 /Users/$currentUser/Library/Application Support/Google/Chrome/Default/Extensions
:D
Posted on 07-31-2014 08:17 AM
Hmm, you could try the following script to gather all the names from the json files in each Extension folder for the current or logged in user. This could probably be easily expanded to work through all local accounts on the Mac to gather the attributes for each account, not just the logged in one.
#!/bin/bash
loggedInUser=$( ls -l /dev/console | awk '{print $3}' )
JSONS=$( find "/Users/${loggedInUser}/Library/Application Support/Google/Chrome/Default/Extensions/" -maxdepth 4 -name "manifest.json" )
while read JSON; do
NAME=$( awk -F'"' '/name/{print $4}' "$JSON" )
if [[ ! -z "$NAME" ]] && [[ ! "$NAME" =~ "_MSG_" ]]; then
EXTS+=( "${NAME}
" )
fi
done < <(echo "$JSONS")
echo "<result>$(echo -e "${EXTS[@]}")</result>"
This should only report on user installed Chrome Extensions and skip all or most of the ones that are default from Chrome itself. For ex, I installed HoverReader and PriceFinder a few minutes ago, ran this script and it pulled those 2 in to the EA results.
Posted on 08-13-2014 09:20 PM
Very helpful! Thank you for the EA, Emily.
Posted on 04-27-2015 10:07 AM
We have been using this script, but I did a bit of research and the MSG prefix in the name message means that it is a localizable file. This is many more extensions than just the google extensions. In our environment about 60% of the extensions had this. I have come up with a script that gets many more of the names if any one is interested. We are using this to see which students have installed proxy/vpn software which is used to circumvent our filters.
Posted on 04-27-2015 10:33 AM
@jrwilcox I'd be interested in seeing that script. Thanks!
Posted on 04-27-2015 10:39 AM
Well, Here it is. It is somewhat more complex, but it does seem to work ok.
#!/bin/bash
#
# Function to grab a string from a json formatted file
#
function jsonval {
temp=`echo $json | sed -e 's/\\////g' -e 's/[{}]//g' | awk -v k="text" '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]}' | sed -e 's/":"/|/g' -e 's/]//' -e 's/[,]/ /g' -e 's/"//g' | grep -w $property | tail -1`
echo ${temp##*|}
}
#
# Function to do one users extensions
#
function getuserextensions {
cd "/Users/${loggedInUser}/Library/Application Support/Google/Chrome/Default/Extensions"
for d in *; do
JSONS=$( find "/Users/${loggedInUser}/Library/Application Support/Google/Chrome/Default/Extensions/$d" -maxdepth 3 -name "manifest.json" )
while read JSON; do
NAME=$( awk -F'"' '/"name"/{print $4}' "$JSON" )
done < <(echo "$JSONS")
if [[ "$NAME" =~ "_MSG_" ]]; then
property=$(echo $NAME | sed -e "s/__MSG_//" -e "s/__//" )
myPath=$(echo $JSONS | sed "s:manifest.json:_locales/en_US/messages.json:" )
if [ ! -f "$myPath" ]; then
myPath=$(echo $JSONS | sed "s:manifest.json:_locales/en/messages.json:" )
fi
json=$(cat "$myPath" | sed '/description/d')
NAME=$(jsonval | sed 's/.*://' )
if [ -z "$NAME" ]; then
property=$(echo "-i $property")
NAME=$(jsonval | sed 's/.*://' )
fi
fi
if [ "${#d}" -eq 32 ];then
EXTS+=( "${NAME} • ${d}
" )
fi
done
}
#
# Main Body of code
#
loggedInUser=$( ls -l /dev/console | awk '{print $3}' )
if [ ! -d "/Users/${loggedInUser}/Library/Application Support/Google/Chrome/Default/Extensions" ]; then
echo "<result>No User logged in unable to check</result>"
exit 0
fi
curdir=${PWD}
getuserextensions
cd "$curdir"
echo "<result>$(echo -e "${EXTS[@]}" | sed -e 's/^[ ]*//' -e '/^$/d' | sort )</result>"
exit 0
It does need a user to be logged in. I should also mention that this will also print the 32 character unique identifier.
Posted on 07-20-2015 08:35 AM
I took a crack at this as well and this is what I came up with. It should gather everything including everything using a messages.json instead of the manifest.json file and spit it into nice outpout.
#!/usr/bin/python
## Script: get_chrome_extensions.py
## Author: Christopher Collins (christophercollins@livenation.com)
## Last Change: 2015-07-14
###########################################
##Description: This script searches the last logged in user's installed extensions and submits it to Casper during an inventory report.
###########################################
import os
import json
from Foundation import CFPreferencesCopyAppValue
#Get name of last logged in user so the extension attribute will report information for the user even if they aren't logged in"
lastloggedinuser = CFPreferencesCopyAppValue('lastUserName', 'com.apple.loginwindow')
userchromepath = '/Users/' + lastloggedinuser + '/Library/Application Support/Google/Chrome/'
#Initialize a dictionary to hold the variable names extension developers used if developers localized their extension
internationalized_extensions = {}
#Initialize a directory to hold the names of the installed extensions
installed_extensions = []
#walk the chrome application support folder
for (dirpath, dirnames, filenames) in os.walk(userchromepath):
#Test to see if file is a manifest.json file and then check its name if it is a placeholder name for a localization file (has __MSG)
#If it is a normal name, then add it to the final list. If its not, add it to the internationalized_extensions dictionary to match against a localized messages.json file
for file in filenames:
if ("Extensions" in dirpath and "manifest.json" in file):
manifest = json.load(open(os.path.join(dirpath, file)))
extension_name = manifest.get('name')
name = extension_name
if '__MSG_'not in extension_name:
installed_extensions.append(extension_name)
else:
extension_name = extension_name[6:-2]
if extension_name not in internationalized_extensions:
internationalized_extensions[extension_name] = extension_name
else:
if (("Extensions" and "locales/en" in dirpath) and "messages.json" in file):
manifest = json.load(open(os.path.join(dirpath, file)))
if manifest:
for key in internationalized_extensions.keys():
if manifest.get(key):
extension_name = manifest.get(key).get('message')
installed_extensions.append(extension_name)
else:
if manifest.get(key.lower()):
extension_name = manifest.get(key.lower()).get('message')
installed_extensions.append(extension_name)
print "<result>{}</result>".format(', '.join(sorted(list(set(installed_extensions)))))
Posted on 01-23-2016 10:10 PM
@chriscollins Thanks for that script, it's working great for me!
I was getting a few errors when I first tried to run it that looked like this;
7400022:/Users/Shared$ python chromeExtensions.py3
Traceback (most recent call last):
File "chromeExtensions.py3", line 60, in <module>
print "<result>{}</result>".format(', '.join(sorted(list(set(installed_extensions)))))
UnicodeEncodeError: 'ascii' codec can't encode character u'u2080' in position 816: ordinal not in range(128)
Changing the last line from:
print "<result>{}</result>".format(', '.join(sorted(list(set(installed_extensions)))))
To:
print "<result>{}</result>".format(', '.join(sorted(list(set(installed_extensions))))encode('utf-8'))
Fixed the errors and allowed the script to run as expected for me.
Posted on 01-25-2016 10:34 AM
@chriscollins, yeah, this script is very nice!
I do have once question, though- the path for the user's home directory . . . The current code assumes that the User's directory will be named the same as their username, and in my environment, this often isn't the case.
I generally script in BASH, and for that language, I get the home directory from DSCL like this:
homedir=$(dscl . -read /Users/$loggedInUser NFSHomeDirectory | awk -F':' 'END{gsub(/^[ ]+/,"",$NF); printf "%s", $NF }')
Is it possible to do that same sort of query for the real homedir path in python? I'm total python newb, never really have used it yet . . . .
Posted on 03-15-2016 11:18 AM
@owen I was getting the same initial error as you, but when I modified the script per your instruction, I'm getting this syntax error:
File "untitled text 33", line 1
,encode('utf-8'))
^
SyntaxError: invalid syntax
What do I need to do?
Posted on 03-15-2016 11:25 AM
@kempt What I posted was missing a dot (.encode) , not sure how that happened. The last line should look like:
print "<result>{}</result>".format(', '.join(sorted(list(set(installed_extensions)))).encode('utf-8'))
Put the full thing here: https://gist.github.com/opragel/83e4136803ca67b4955a#file-get_chrome_extensions-py
Thanks again to @chriscollins for writing the extension.
Posted on 04-01-2016 11:54 AM
@jrwilcox does this work like an extension attribute?
Posted on 05-26-2016 12:17 PM
I've been having trouble getting a few of these to work recently… not sure if it's because of JSS changes, Chrome changes, who knows what else… I managed to get @mm2270's working by changing how it gets the loggedinUser, but the display is kind of wonky:
#!/bin/bash
loggedInUser=`python -c 'from SystemConfiguration import SCDynamicStoreCopyConsoleUser; import sys; username = (SCDynamicStoreCopyConsoleUser(None, None, None) or [None])[0]; username = [username,""][username in [u"loginwindow", None, u""]]; sys.stdout.write(username + "
");'`
JSONS=$( find "/Users/${loggedInUser}/Library/Application Support/Google/Chrome/Default/Extensions/" -maxdepth 4 -name "manifest.json" )
while read JSON; do
NAME=$( awk -F'"' '/name/{print $4}' "$JSON" )
if [[ ! -z "$NAME" ]] && [[ ! "$NAME" =~ "_MSG_" ]]; then
EXTS+=( "${NAME}
" )
fi
done < <(echo "$JSONS")
echo "<result>$(echo -e "${EXTS[@]}")</result>"
Is there a way to control how the output is displayed? Nothing in the JSS's HTML screamed incorrect formatting to me, but I could be missing something in padding or floats. Any recommendations?
Posted on 05-26-2016 12:30 PM
@emily Try it this way. My script was written a while ago, before I started using printf
for printing arrays, which produces much more reliable output. This one should work better:
#!/bin/bash
loggedInUser=`python -c 'from SystemConfiguration import SCDynamicStoreCopyConsoleUser; import sys; username = (SCDynamicStoreCopyConsoleUser(None, None, None) or [None])[0]; username = [username,""][username in [u"loginwindow", None, u""]]; sys.stdout.write(username + "
");'`
JSONS=$( find "/Users/${loggedInUser}/Library/Application Support/Google/Chrome/Default/Extensions/" -maxdepth 4 -name "manifest.json" )
while read JSON; do
NAME=$( awk -F'"' '/name/{print $4}' "$JSON" )
if [[ ! -z "$NAME" ]] && [[ ! "$NAME" =~ "_MSG_" ]]; then
EXTS+=( "${NAME}" )
fi
done < <(echo "$JSONS")
echo "<result>$(printf '%s
' "${EXTS[@]}")</result>"
Posted on 05-26-2016 12:51 PM
Oh, @emily Are you using JSS 9.92 by any chance? If so, take a look at @millersc's post here: https://jamfnation.jamfsoftware.com/discussion.html?id=19987#responseChild120571
I think that may explain the crux of the display issue you're seeing. We're not on 9.92 yet, so this was the first I'd seen of this. Oy.
Posted on 05-26-2016 12:51 PM
Better, but still not quite right.
At this point, I'm guessing it's more of a JSS web layout issue than an EA issue. Though nothing in the stylesheet really screamed out at me to cause the misalignment… hrm.
Posted on 05-26-2016 01:16 PM
Yeah, seems to be a bug/defect. See my post above with a link to a post on the issue on the JSS 9.92 thread. That's why I asked if you happened to be on that release? if so, it sounds exactly like the issue described there.
Posted on 05-26-2016 01:32 PM
Ah yeah, missed that. We are on 9.92, but I'm working in a new JSS so I don't have a basis for comparison here. It may very well be related.
Posted on 05-27-2016 06:35 AM
I posted a new EA the other day --
https://jamfnation.jamfsoftware.com/viewProductFile.html?fid=859
It may not be perfect, but you can contribute on GIT if you want
https://github.com/igeekjsc/JAMF-Extension-Attributes
Posted on 05-27-2016 06:38 AM
My EA is a lot like @mm2270
But I do a little extra work to find out what the "__MSG" extensions really are.
Posted on 05-27-2016 06:41 AM
Also - please consider voting up this feature request
https://jamfnation.jamfsoftware.com/featureRequest.html?id=4615
Would help tremendously with these types of data queries.
Posted on 01-24-2017 02:55 PM
I wrote another flavor of the Chrome extensions EA, but this one allows you to specify failover locales (en
, then en_US
, then en_GB
, etc.) and it also pulls the extension version.
https://gist.github.com/homebysix/da935f8f0ef88d7d4b6300ff14066ca6
Multi-line EA output is tricky to filter in a useful way, but at least this will give you the raw data to start from.
Posted on 05-04-2017 05:57 PM
Thanks alot for the script guys. Im using it to list all chrome extensions so i can see which students are running Ultrasurf. The script runs and returns the full list of chrome extensions but... how do i make a smart group now? Im new to this so please be patient. My ideal project is to detect which machines are running ultrasurf and then find a script to delete it from their computer.
Posted on 05-05-2017 04:58 AM
Chrome supports the ability to blacklist specific plugins. It would be much easier to blacklist this one. Once it is blacklisted chrome will not let any one use the extension and it will block other users from downloading it.
Posted on 05-05-2017 05:00 AM
@jrwilcox How do we do this exactly?
Posted on 05-05-2017 05:07 AM
I have done this using a configuration profile.
You need to create a plist file with the extensions you don't want. Ours has grown over the years. But it would look something like this:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>ExtensionInstallBlacklist</key>
<array>
<string>fdcgdnkidjaadafnichfpabhfomcebme</string>
<string>omghfjlpggmjjaagoclmmobgdodcjboh</string>
<string>ojhgknhfdjheakddcdenanbgaaepcijb</string>
<string>ckiahbcmlmkpfiijecbpflfahoimklke</string>
<string>eelphgpfmjhndihoopgadghfonahifel</string>
<string>gjgadmpbpojbdcehgijdlboanljfmnel</string>
<string>idefjamndcpplnamdlbodoebjgkpdmpn</string>
<string>mpmikmnnnoacchojfpdgfdgpkfgajhim</string>
<string>fcbnikgemihknccdjaihjnfbapinljpi</string>
<string>bkjcdfmmpdfjohenejbkaaafkoeknjnh</string>
<string>gnenekpofbpieiafoofnnphgdmloiheo</string>
<string>jhdlphnpjdilnjmhgepbgaompckdjdbf</string>
<string>dpplabbmogkhghncfbfdeeokoefdjegm</string>
<string>egnccllcfmpcmeccejlbbnmobnaglbka</string>
<string>gbchcmhmhahfdphkhkmpfmihenigjmpp</string>
<string>pohhhgpookhmdgjnngkgkbhklplbompp</string>
<string>lledpflfnanamkogoclkgaggfdgoalok</string>
<string>pdkmdmbjlgckgcffnndhhlmifaobafji</string>
<string>padekgcemlokbadohgkifijomclgjgif</string>
<string>omihnninlhneakfglooiofgdbpmnhjgn</string>
<string>gchhimlnjdafdlkojbffdkogjhhkdepf</string>
<string>okeigjflfhffjfkjkgaipencahpaiipd</string>
<string>eifppljhjomneeocmoogcpfdkbemkbln</string>
<string>jdhebjohjpgicipoimkglgledckdalke</string>
<string>ipdbcacaocfljmgjidojcfgohgfnjeli</string>
<string>dffcdhcicpnijbiloigogbgigiepgbpn</string>
<string>ldikpbpacmiafmhiifihmicokeallbim</string>
<string>cjnfcmkfdcoeckplikldabeggcohmbmj</string>
<string>cldflcjakandmfifipfanklcdfhdiaph</string>
<string>gohbopcmfdjomkmighlcflfjoleafmgj</string>
<string>hghdlbnadahkknlbmckfljpcoilldcoa</string>
<string>gcknhkkoolaabfmlnjonogaaifnjlfnp</string>
<string>eiojlieidcgfibngioiipcabhhheklpi</string>
<string>ocneleoikjgphlhjpeoabocgcegemegd</string>
<string>kpiecbcckbofpmkkkdibbllpinceiihk</string>
<string>dookpfaalaaappcdneeahomimbllocnb</string>
<string>kphedknfgjnjghfjgjnggidjefechgak</string>
<string>gjknjjomckknofjidppipffbpoekiipm</string>
<string>kdgfdpeigidmiagopmgmnpkaokkofnbb</string>
<string>ikdfimhecflbddjmblgbkinhfjlkmeni</string>
<string>bibmocmlcdhadgblaekimealfcnafgfn</string>
<string>deoodoglhbmpafkajmlggnjnngdclnie</string>
<string>kcndmbbelllkmioekdagahekgimemejo</string>
<string>iobkgicmookonkhaijnhoodijfhiljha</string>
<string>eggfigcgijdfegcagkmkbdjokhkhgiek</string>
<string>cmgnmcnlncejehjlnhaglpnoolgbflbd</string>
<string>iilpibhiihokecnbdkaminemnmecjfed</string>
<string>angbhbjbplfpkbcijbkhecjfcfgjbjoc</string>
<string>nijojjpfbokhhlkphhjdlhdigfhgpndd</string>
<string>fepeagfcjjbnchdgkglpinpiocbjbbhn</string>
<string>ondofellpdgkikhlhfkiecjnkdmghpah</string>
<string>gonhdadhgidiinkldgjolmnjlcekjffj</string>
<string>gdocgbfmddcfnlnpmnghmjicjognhonm</string>
<string>maicibfoihmlppibfkljeljefamfndbp</string>
<string>mnjmjnofadekgmfahkikcjbckdofddbb</string>
<string>mdlcjoghfabibdedbcpobangfgppnnbo</string>
<string>lcojcmfieongdpblaefmjnegimcilifa</string>
<string>cbipoicmapnmmmcbaagfagnlcdhgohfj</string>
<string>bjgbkkeghhelcgfnklahganohbmpldke</string>
<string>gpabelodkfbnigmjdlhdjcbjoimjjmap</string>
<string>ggmdpepbjljkkkdaklfihhngmmgmpggp</string>
<string>pminladjmndipkjkmdjhhbidegbjoemn</string>
<string>bojjojmafbggldbgcohmpnedmimmicjf</string>
<string>cegfejpmmodikpdebjkdnkgcifhfepfi</string>
<string>cmnfgkpgdakahclbpekkppahnkcbogka</string>
<string>gkojfkhlekighikafcpjkiklfbnlmeio</string>
<string>epbfmioobedknooiakdehepogalbgkng</string>
<string>gcbommkclmclpchllfjekcdonpmejbdp</string>
<string>aadhbdhoolgcjfdplbjpfmmobcjmhklf</string>
<string>gkopihinfioonpbajbajblgphaicajpn</string>
<string>mnloefcpaepkpmhaoipjkpikbnkmbnic</string>
<string>kbiknomhfomgpmobhoapjocngjmhdlhk</string>
<string>nokjbkkpjgooeoegnbodmelenklgabpm</string>
<string>bghpialiocekfipnbidmbhcbibpchjpb</string>
<string>nabijffolhanhlbkmakkfgfeadcgkmna</string>
<string>mjnbclmflcpookeapghfhapeffmpodij</string>
<string>joglidlgpbjaokkllogcnodcjckajdni</string>
<string>nlbejmccbhkncgokjcmghpfloaajcffj</string>
<string>hbgknjagaclofapkgkeapamhmglnbphi</string>
<string>baiknijknkfpoaehpnnjnjiidjonhfbb</string>
<string>haagnpmcndhgepbnileochmgmdenapjg</string>
<string>lebpnjmmkockepeffbadcnechelmhekc</string>
<string>ifalmiidchkjjmkkbkoaibpmoeichmki</string>
<string>lpgemjggacakklinlcfamaemnkbngmcf</string>
<string>oicamophdnojgacgbobolcnhbbgpiknb</string>
<string>baaclllfceolpgfimibgppgeojbeebcd</string>
<string>mfoejjmlljjjiokompekfbdhaikjpijg</string>
<string>mbnapgdcalopgfpleapnelndfhlebpmg</string>
<string>njconeaigoafkdkcoaioddgmcioocabh</string>
<string>lecomokapcbeofiomnjihgbkfcnhogil</string>
<string>omdakjcmkglenbhjadbccaookpfjihpa</string>
<string>dbgcbfajoppbhoakhjnfcpbkhomfabko</string>
<string>eiddfaedmgnpnnojolcknhpjbmmpplgd</string>
<string>eaadkdmjbccopjhknndhjpnbhbklonbc</string>
<string>jlgkdcolhnlfkojbhjdbgeghollibcga</string>
<string>ocmcdcmdgjejpidljphlgcgedlpjbfhh</string>
<string>aifcmpjfhomafllokdkefjkbepbghhlk</string>
<string>fhmfcdjnaimddaiemgmnggelpajkhngi</string>
<string>jincbfompjbjnkbldjdhnkekihdanila</string>
<string>lbggnklgidgdboipgkcefdeojekpcomo</string>
<string>jnepnignpggeebkgdmdbmjgdkeapkhmp</string>
<string>fjpglcmmjcmnfigjjgpnajgiejppjfha</string>
<string>iklpfnjfjjdghbldecfhmkpnnojaifpk</string>
<string>objkcphggobldholmnidihoibcapbmdi</string>
<string>lbhdjpmomigdcfkidmimojhnoacaffcg</string>
<string>gammobjddihgegcpnbmgipcmbejcjffn</string>
<string>pooljnboifbodgifngpppfklhifechoe</string>
<string>ngppcmdmopkgobmmcankecnpkkdkoeng</string>
<string>deoeenbkoccjaefmmhpmlegngdjohdcm</string>
<string>ikdfimhecflbddjmblgbkinhfjlkmeni</string>
<string>alakcphnkenhpgmjgcpapeiaifddhbop</string>
<string>ojfgcfilbphjeipkknjlkkkjboklihcn</string>
<string>jcgcdicmlhepcpjcnafjfdcgdofcoleo</string>
<string>omghfjlpggmjjaagoclmmobgdodcjboh</string>
<string>acbclpnddfeendndgplngifjjihimbcg</string>
<string>nfhpjjacpaacbcncddkhmhdgkfgnkffh</string>
<string>opalpjjboefohnelaemnhdhlceibbcgl</string>
<string>kfblffmcfhcclgeeialffpdamibbpkma</string>
<string>aennjkgpfcjeilhccfkohcpmkgpeaiih</string>
<string>edljfdnikiehndnhcfaohnijpfidhhpc</string>
<string>fjfggdolkejgbladjgiafdfdddahiipg</string>
<string>aonncbclmineeaebnfdadmaclpbogbdl</string>
<string>bihmplhobchoageeokmgbdihknkjbknd</string>
<string>opalpjjboefohnelaemnhdhlceibbcgl</string>
<string>apepmbbejdeohmablkgnmngfpfapkhba</string>
<string>bohjiepdaibaajbeedilfpdniijmmccf</string>
<string>fdehilofdbonobjnkoijeiggnaddekdm</string>
<string>aghegkgojapdjklinomabbgdlanpkdmk</string>
<string>jbmkeiogkjmcmmkojnebgaglcideikab</string>
<string>pphbjiclbdndpilnpjiamjonmpfddfma</string>
<string>kebmnjndjbfhllgaengdjdobfhokkpca</string>
<string>jccmoegogckfgbnllaapbhbpcohhknmc</string>
<string>loenplbihejlgppngjjplpnejgdmhlpc</string>
<string>fdhfkpocplboibnjgpiijhnchmeffalo</string>
<string>enhcpffgidjhkgnnmiaeennhgjldopeh</string>
<string>mfmeacflmeoggmfbimnmoobleekojlca</string>
<string>ibgnlbelphlakpocgjhmfgeegfminhel</string>
<string>gmolfjcfkljcegibacpmhnanbfkbmcnh</string>
<string>ocdlmemhcamdekmepajibiaepaajaepo</string>
<string>bkommgglgedojaffpdbadghkofkjfiej</string>
<string>jiicoamlefgfcjdiaoggmclhndecenpm</string>
<string>kcgfoobdbmnnpmoagfkgjgmiipnolhbj</string>
<string>aieheoflmhngknnnimkhooklagfidikp</string>
<string>olkbmocoahljgmegapgaefipjpdklpdd</string>
<string>gmakhlakpiackdmiodepgbllmejakkgf</string>
<string>epophiljpfjmehfmmifggbgpdhlpflfa</string>
<string>bjdoolacknjicapllfnlnmfmppifnpba</string>
<string>ogfnpoaboimnmogpddgkphgkbgooomhg</string>
<string>nbkcgajmoblcepfdmpfnphjjmbfnckhp</string>
<string>eoeecjmgnmpnljngnagabdpmahamaaoh</string>
<string>heajfgnegopeedndeahkdjedjkjcmnpb</string>
<string>mafcnffiekamcoipelofhbnpnhjppged</string>
<string>odiddbcijempnhhobijfbggjogofdlgl</string>
<string>hoapmlpnmpaehilehggglehfdlnoegck</string>
<string>oknedbefhljbabbioodiahaapfbogceg</string>
<string>cocfojppfigjeefejbpfmedgjbpchcng</string>
<string>gacjfopciepniimkpbikjinckfncgmid</string>
<string>ledoohjcfaalphjbfhldfdpnpmnfgdhe</string>
<string>kgdohnpohekcfdpcindahcedncliibij</string>
<string>gfmpdjndpbomeamnkmjepilkkcoeicma</string>
<string>oeejfcielojbbeepbdginbpijbfhmkcg</string>
<string>ajfiodhbiellfpcjjedhmmmpeeaebmep</string>
<string>fjhcpnpblahnhdmalehachcdlnlggehd</string>
<string>idgiipeogajjpkgheijapngmlbohdhjg</string>
<string>pddlkidaibpbhpkfbhkbeolbagpmkhhn</string>
<string>bdbcklhdhokpgjjdhilhaoaidapanofb</string>
<string>mlekbhaipaoidoahjmgecceeecfondjb</string>
<string>ojedkepkekklpjcgdfiahladdbopbooh</string>
<string>nbcojefnccbanplpoffopkoepjmhgdgh</string>
<string>lkjblbljedhgggafaigpdpjjpphhmnoo</string>
<string>ehfljgbbpjgcfondpjcmbfmmpnhchfkg</string>
<string>hpfbfcdoiipkblfeknfggcmfppacjife</string>
<string>lgpiomikidaaibmkadpabhakjeapkgnm</string>
<string>ibdpficdcmlkjnaigfebpbomaneenpll</string>
<string>johnlmmilpdeggdcdbgepopajkbmbheh</string>
<string>joaobgacfnccmhgahonaofjigfiadllb</string>
<string>lfbhcdkmkklcpifcnknkjhogjpijihkl</string>
<string>jfjeodcjjbbmblgpakgmaedoilnhmcnp</string>
<string>eaflheocdgkooaonmhhfjfalgeljkknk</string>
<string>degbkghkliblcgkegaeofdmfjfbfnmfb</string>
<string>ghfbbjimolmcijjfnohefkggjgnpmmcg</string>
<string>bgfegfkfcickgjmkibdilgmmdoobpdkb</string>
<string>hlacajbkonocfmdfgdkdjmpneojpbllj</string>
<string>epepldfkiegplfikfabpojdolifladlk</string>
<string>bhapkddefgijeoiecegphobpgpjcgbcj</string>
<string>hbfeadheangdffoapflbkeablgbgloja</string>
<string>pbajhjcjhieagcbiljmekgechllcdhcd</string>
<string>gjpmoooajbcolkelmdengjinljlcbiie</string>
<string>ljejahkefpkedlaabpmepcikgmnknile</string>
<string>oofgbpoabipfcfjapgnbbjjaenockbdp</string>
<string>dgflkllhdalglbkeogdoihcigiekmjgk</string>
<string>ojagfgibjiofppmilfbgmipfelkhcccn</string>
<string>hnmpcagpplmpfojmgmnngilcnanddlhb</string>
<string>gfglncanejnkbknnmemmelgcjfodcejl</string>
<string>bdbmnbbkhbnhamnhndkacfibdlbooihm</string>
<string>lflaacejokglacdflhelmdnneieidhmj</string>
<string>agooajdlfljhhbliomhpincjnnndgffk</string>
<string>obdgehdaihabnaagihegbkacgfefdjpc</string>
<string>flgagpabgbihkajlfcaeplgnpicdojab</string>
<string>dlmiaagjplojbkjdceggjmaabanocndi</string>
<string>mpcaainmfjjigeicjnlkdfajbioopjko</string>
<string>jopjlpjeekmmnpdiplggikdjkgkfklno</string>
<string>pcmmjfpfjlcdhhngjkkfbeoaohbgjhgp</string>
<string>nenecalochlgjiegbfppigfhkjdpglnm</string>
<string>mhjhchlgdmkmgfgjobpbajakhlmajjpj</string>
<string>egjnnogealenpdnalnponnakmimmhklf</string>
<string>nijebgacophnpgohfblkmdbjbmfcjagd</string>
<string>lobjodcpekhnpndpjgkikjecmcjbdifd</string>
<string>mpcaainmfjjigeicjnlkdfajbioopjko</string>
<string>apkmkagbnjdldlchjaodkghnknglccal</string>
<string>eocembdiaelakgjoheclffagagbgpejg</string>
<string>nocfiicinjlacbcpohmbcndlmmfmlidk</string>
<string>nknebiagdodnminbdpflhpkgfpeijdbf</string>
</array>
</dict>
</plist>
Posted on 05-05-2017 06:40 AM
Thank you @jrwilcox for sharing all those ID's to add to my list. This has seemed like the best way for me to handle it too. It works very well!
Posted on 06-29-2018 11:55 AM
Worked like a charm! Thanks Emily.
Posted on 04-07-2020 08:01 AM
Hey all,
Loving these extension attributes, but looking for one that reports the Extension name from chrome, then the ID number for the same extension. Anyone have a working version that does this?
Gabe Shackney
Princeton Public Schools
Posted on 01-08-2021 01:20 PM
In looking at our installs of Chrome, most (if not all) of our users have multiple profiles, making the
/Users/${loggedInUser}/Library/Application Support/Google/Chrome/Default/Extensions/
line irrelevant. Instead of "Default", we see "Profile 1", "Profile 2", etc.
I am having trouble making the "find" command work with a wildcard in place of "Default" in the path.
Any suggestions?
Posted on 06-12-2022 07:56 PM
Anyone have an updated EA script that works with Monterey & Big Sur with the profile changes to Google Chrome?
/Users/${loggedInUser}/Library/Application Support/Google/Chrome/Profile [#]/Extensions/
Posted on 08-15-2022 11:35 AM
Like @gburcham stated, does anyone have a new EA script? Can't get any of the ones above to work correctly.
Posted on 02-20-2023 09:10 AM
FWIF, I am using $(whoami) in place of ${loggedINUser} and at least getting output. It is not reporting an extension that I know is installed and listing more information than the extension, but with the script below, this is the furthest I have made it.
I am very much a beginner with scripting, but let me know if it helped at all?
#!/bin/bash
# Get logged in user
CURRENT_USER=$(whoami)
# Path to the Chrome extension directory
JSONS=$( find "/Users/$(whoami)/Library/Application Support/Google/Chrome/Default/Extensions/" -name "manifest.json" )
while read JSON; do
NAME=$(awk -F'"' '/name/{print $4}' "$JSON")
if [[ ! -z "$NAME" ]] && [[ ! "$NAME" =~ "__MSG_appName__","__MSG_APP_NAME__" ]]; then
EXTS+=("${NAME}
" )
fi
done < <(echo "$JSONS")
echo "$(echo "${EXTS[@]}")"