首页 > 解决方案 > 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)将不会绕过分配给该用户配置文件的任何安全设置。

我理解正确吗?有什么我错过的吗?

标签: pythonsecuritypywin32win32com

解决方案


[GitHub]:mhammond/pywin32 - 适用于 Windows 的 Python (pywin32) 扩展重点是我的)状态:

这是 Python for Win32 (pywin32) 扩展的自述文件,它提供从 Python 对许多 Windows API 的访问

因此,PyWin32是对WINAPIPython包装器(它只允许从Python以友好的方式调用它们)。不管它(不)是否安装在Python安装中,WINAPI仍然存在并且可以从以下位置访问:

由于Pywin32没有官方文档页面,我将参考下一个最好的东西(我发现):[ActiveState.Docs]: PyWin32 Documentation

例子:


底线

PyWin32(默认情况下)没有授予额外的特权(权利)


但是,我试图找到管理层对安装PyWin32的担忧的原因。

一般来说,专家(在WINAPI领域)很可能知道:

  1. C(开发人员数量正在减少)
  2. Win internals(这里也不是很多)
  3. 通用计算机(低级)知识
  4. 从上面的 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%以上的盗贼(平庸的盗贼)
  • 对真正的主人没有影响

推荐阅读