| # Copyright 2015 The Chromium Authors. All rights reserved. | 
 | # Use of this source code is governed by a BSD-style license that can be | 
 | # found in the LICENSE file. | 
 |  | 
 | """Dumps a Windows shortcut's property bag to stdout. | 
 |  | 
 | This is required to confirm correctness of properties that aren't readily | 
 | available in Windows UI. | 
 | """ | 
 |  | 
 | import optparse | 
 | from pywintypes import IID | 
 | import sys | 
 | from win32com.propsys import propsys | 
 | from win32com.propsys import pscon | 
 |  | 
 |  | 
 | def PrintShortcutProperties(shortcut_path, dump_all): | 
 |   properties = propsys.SHGetPropertyStoreFromParsingName(shortcut_path) | 
 |  | 
 |   print 'Known properties (--dump-all for more):' | 
 |  | 
 |   app_id = properties.GetValue(pscon.PKEY_AppUserModel_ID).GetValue() | 
 |   print '\tAppUserModelId => "%s"' % app_id | 
 |  | 
 |   # Hard code PKEY_AppUserModel_IsDualMode as pscon doesn't support it. | 
 |   PKEY_AppUserModel_IsDualMode = (IID('{9F4C2855-9F79-4B39-A8D0-E1D42DE1D5F3}'), | 
 |                                   11) | 
 |   dual_mode = properties.GetValue(PKEY_AppUserModel_IsDualMode).GetValue() | 
 |   print '\tDual Mode => "%s"' % dual_mode | 
 |  | 
 |   # Dump all other properties with their raw ID if requested, add them above | 
 |   # over time as we explicitly care about more properties, see propkey.h or | 
 |   # pscon.py for a reference of existing PKEYs' meaning. | 
 |   if dump_all: | 
 |     print '\nOther properties:' | 
 |     for i in range(0, properties.GetCount()): | 
 |       property_key = properties.GetAt(i) | 
 |       property_value = properties.GetValue(property_key).GetValue() | 
 |       print '\t%s => "%s"' % (property_key, property_value) | 
 |  | 
 |  | 
 | def main(): | 
 |   usage = 'usage: %prog [options] "C:\\Path\\To\\My Shortcut.lnk"' | 
 |   parser = optparse.OptionParser(usage, | 
 |                                  description="Dumps a shortcut's  properties.") | 
 |   parser.add_option('-a', '--dump-all', action='store_true', dest='dump_all', | 
 |                     default=False) | 
 |   options, args = parser.parse_args() | 
 |  | 
 |   if len(args) != 1: | 
 |     parser.error('incorrect number of arguments') | 
 |  | 
 |   PrintShortcutProperties(args[0], options.dump_all) | 
 |  | 
 |  | 
 | if __name__ == '__main__': | 
 |   sys.exit(main()) |