我正在开发一个开源的.NET程序集(WinSCP .NET程序集),它会生成一个本地(C++)应用程序,并通过事件和文件映射对象与其通信。
该程序集使用
在大多数情况下,它都可以正常工作。但现在我遇到了一个用户,在Windows Server 2008 R2 64位上的ASPX应用程序中使用该程序集时出现了问题。
在他的情况下,
我尝试通过明确授予当前用户对事件对象和应用程序代码所需的访问权限(而不是原始的EVENT_ALL_ACCESS)来改进汇编代码,如Microsoft Docs example所示。但这并没有帮助解决问题,因此我甚至没有尝试对文件映射对象进行相同的操作。
创建事件的C#代码如下:
(对于其他事件,访问级别是
我还尝试在对象名称前添加
有人知道是什么原因导致
该程序集使用
Process
类生成应用程序,没有特殊设置。程序集创建了一些事件(使用EventWaitHandle
)和文件映射(使用PInvoked CreateFileMapping
),应用程序使用OpenEvent
和OpenFileMapping
打开这些内容。在大多数情况下,它都可以正常工作。但现在我遇到了一个用户,在Windows Server 2008 R2 64位上的ASPX应用程序中使用该程序集时出现了问题。
在他的情况下,
OpenEvent
和OpenFileMapping
都返回NULL
,而GetLastError
返回ERROR_ACCESS_DENIED
。我尝试通过明确授予当前用户对事件对象和应用程序代码所需的访问权限(而不是原始的EVENT_ALL_ACCESS)来改进汇编代码,如Microsoft Docs example所示。但这并没有帮助解决问题,因此我甚至没有尝试对文件映射对象进行相同的操作。
创建事件的C#代码如下:
EventWaitHandleSecurity security = new EventWaitHandleSecurity();
string user = Environment.UserDomainName + "\\" + Environment.UserName;
EventWaitHandleAccessRule rule;
rule =
new EventWaitHandleAccessRule(
user, EventWaitHandleRights.Synchronize | EventWaitHandleRights.Modify,
AccessControlType.Allow);
security.AddAccessRule(rule);
rule =
new EventWaitHandleAccessRule(
user, EventWaitHandleRights.ChangePermissions, AccessControlType.Deny);
security.AddAccessRule(rule);
new EventWaitHandle(
false, EventResetMode.AutoReset, name, out createdNew, security);
“打开”事件的C++代码如下:
OpenEvent(EVENT_MODIFY_STATE, false, name);
(对于其他事件,访问级别是
SYNCHRONIZE
,具体取决于需要。)我还尝试在对象名称前添加
Global\
前缀。如预期所料,这并没有解决问题。有人知道是什么原因导致
OpenEvent
(或CreateFileMapping
)出现“访问被拒绝”的错误吗?
OpenProcessToken
获取当前进程的令牌,将其传递给GetTokenInformation
并使用检索到的SID用于来自文章《创建新对象的安全描述符》的代码? - Martin Prikryl