python - PyWin32 能否让用户“过多”地访问 Win32 API?
问题描述
我正在为具有非常高安全标准的公用事业组开发一种工具(出于显而易见的原因)。该工具在 ESRI 的 ArcMap 应用程序中运行(使用 ArcMap API - ArcPy)。ArcFM 是安装在 ArcMap 之上的软件,用于基于实用程序的分析(ArcFM 具有与 ArcMap 不同的许可证)。我正在开发的工具需要 ArcPy (Python) 才能使用 PyWin32 签出 ArcFM 许可证(请参见下面的代码段)
#ArcFM licensing
import win32com.client
app = win32com.client.Dispatch("Miner.Framework.Dispatch.MMAppInitializeDispatch")
runtime = win32com.client.Dispatch("Miner.Framework.Dispatch.MMRuntimeEnvironmentDispatch")
app.Initialize(0x5)
#end ArcFm licensing
为了在我正在开发的工具中使用某些 ArcFM 功能,必须首先在脚本中签出 ArcFM 许可证。
此代码段检查 ArcFM 的许可证,以便我可以在 GUI 之外访问 ArcFM 功能。Utility Group 的 IT 主管一直对在他们的计算机上安装 PyWIN 犹豫不决,因为他/她担心这会让用户过多地访问自己的计算机。
据我了解,Win32 不会让用户“额外”访问他们的计算机(它只允许他们通过 API 访问功能)。例如,如果用户无权访问注册表项,Win32(或 PyWin32)将不会绕过分配给该用户配置文件的任何安全设置。
我理解正确吗?有什么我错过的吗?
解决方案
[GitHub]:mhammond/pywin32 - 适用于 Windows 的 Python (pywin32) 扩展(重点是我的)状态:
这是 Python for Win32 (pywin32) 扩展的自述文件,它提供从 Python 对许多 Windows API 的访问。
因此,PyWin32是对WINAPI的Python包装器(它只允许从Python以友好的方式调用它们)。不管它(不)是否安装在Python安装中,WINAPI仍然存在并且可以从以下位置访问:
- C
Python也是如此(例如使用[Python 3]: ctypes - A foreign function library for Python),但代码会很多:
- 更长(需要各种转换)
- 可读性较差(大量“维护”代码 - 与业务逻辑无关)
- 容易出错
您可以检查[SO]: Get the title of a window of another program using the process name (@CristiFati's answer)以了解这两种方法之间的区别(也检查[SO]: python win32service - Gettingtriggered startup服务信息(@CristiFati 的回答))。其他语言
由于Pywin32没有官方文档页面,我将参考下一个最好的东西(我发现):[ActiveState.Docs]: PyWin32 Documentation。
例子:
- 既然你提到了注册表:
- [ActiveState.Docs]:win32api.RegOpenKeyEx包装[MS.Docs]:RegOpenKeyExW 函数
- 但也许这不是最好的例子,因为注册表函数也可以通过[Python 3] 获得:winreg - Windows 注册表访问(它是Python标准库的一部分)
- 另一个(与安全有关):
底线
PyWin32(默认情况下)没有授予额外的特权(权利)。
但是,我试图找到管理层对安装PyWin32的担忧的原因。
一般来说,专家(在WINAPI领域)很可能知道:
- C(开发人员数量正在减少)
- Win internals(这里也不是很多)
- 通用计算机(低级)知识
- 从上面的 3 个中,这些用户会知道调用WINAPI的含义(如果没有,他们很容易知道在哪里/什么搜索/调查以获得答案)
从这些用户的PoV来看,没有什么区别。但是由于可以查询PyWin32模块的内容:
>>> import win32security >>> >>> print([name for name in dir(win32security) if callable(getattr(win32security, name))]) ['ACL', 'AcceptSecurityContext', 'AcquireCredentialsHandle', 'AdjustTokenGroups', 'AdjustTokenPrivileges', 'AllocateLocallyUniqueId', 'CheckTokenMembership', 'ConvertSecurityDescriptorToStringSecurityDescriptor', 'ConvertSidToStringSid', 'ConvertStringSecurityDescriptorToSecurityDescriptor', 'ConvertStringSidToSid', 'CreateRestrictedToken', 'CreateWellKnownSid', 'CredHandleType', 'CryptEnumProviders', 'CtxtHandleType', 'DsBind', 'DsCrackNames', 'DsGetDcName', 'DsGetSpn', 'DsListDomainsInSite', 'DsListInfoForServer', 'DsListRoles', 'DsListServersForDomainInSite', 'DsListServersInSite', 'DsListSites', 'DsUnBind', 'DsWriteAccountSpn', 'DuplicateToken', 'DuplicateTokenEx', 'EnumerateSecurityPackages', 'GetBinarySid', 'GetFileSecurity', 'GetKernelObjectSecurity', 'GetNamedSecurityInfo', 'GetPolicyHandle', 'GetSecurityInfo', 'GetTokenInformation', 'GetUserObjectSecurity', 'ImpersonateAnonymousToken', 'ImpersonateLoggedOnUser', 'ImpersonateNamedPipeClient', 'ImpersonateSelf', 'InitializeSecurityContext', 'IsTokenRestricted', 'LogonUser', 'LogonUserEx', 'LookupAccountName', 'LookupAccountSid', 'LookupPrivilegeDisplayName', 'LookupPrivilegeName', 'LookupPrivilegeValue', 'LsaAddAccountRights', 'LsaCallAuthenticationPackage', 'LsaClose', 'LsaConnectUntrusted', 'LsaDeregisterLogonProcess', 'LsaEnumerateAccountRights', 'LsaEnumerateAccountsWithUserRight', 'LsaEnumerateLogonSessions', 'LsaGetLogonSessionData', 'LsaLookupAuthenticationPackage', 'LsaOpenPolicy', 'LsaQueryInformationPolicy', 'LsaRegisterLogonProcess', 'LsaRegisterPolicyChangeNotification', 'LsaRemoveAccountRights', 'LsaRetrievePrivateData', 'LsaSetInformationPolicy', 'LsaStorePrivateData', 'LsaUnregisterPolicyChangeNotification', 'MapGenericMask', 'OpenProcessToken', 'OpenThreadToken', 'PyCredHandleType', 'PyCtxtHandleType', 'PySecBufferDescType', 'PySecBufferType', 'QuerySecurityPackageInfo', 'RevertToSelf', 'SECURITY_ATTRIBUTES', 'SECURITY_DESCRIPTOR', 'SID', 'SecBufferDescType', 'SecBufferType', 'SetFileSecurity', 'SetKernelObjectSecurity', 'SetNamedSecurityInfo', 'SetSecurityInfo', 'SetThreadToken', 'SetTokenInformation', 'SetUserObjectSecurity', 'TranslateName', 'error']
这可能会得到另一种用户的想法。
所以(有争议的:错误的)问题是,一个巨大的权力(包括知识的权力)与可能没有处理该权力所需的重大责任的用户共享。在某些情况下,这可能会导致(有点戏剧化)灾难(无论是因为错误还是恶意,这并不重要)。
与现实生活中的场景相提并论:在你的门上有一把假锁(或海滩鞋里的钱包):
- 将阻止〜90%以上的盗贼(平庸的盗贼)
- 对真正的主人没有影响
推荐阅读
- java - sparksession 中的错误,因为 sparksession 无法解决
- javascript - Firestore 函数 .where 不是函数
- c# - Atata - 无法从表格行中定位元素
- javascript - 在对象数组中查找对象返回未定义
- html - 交替功能列表 css
- jquery - 我的激活菜单的 Jquery 函数不起作用
- php - PHPUnit 与 PHP 7.0 不兼容的版本
- java - 如何在 Spring 中将一些文本添加到所有控制器 URL
- multilingual - 带有数学/科学符号的多语言 LaTeX 文档
- python - 使用 Dash 向引导表中的单元格添加工具提示