IUSR VS ADMINISTRATOR权限受阻

由IIS6启动的应用程序(由于HTTP请求)未能初始化一个dll。 如果通过双击本地login,以pipe理员身份启动它,一切都很好。

此应用程序通过名为cryptlib的第三方DLL使用TLSencryption。 http://www.coastrd.com/smtps/cryptlib这应该不是什么大问题,因为我的大多数CGI应用程序都使用MySQL / zlib / … etc dll没有问题。 在这种情况下(可能是由于创buildSSL / TLS会话的性质),如果通过以pipe理员身份双击来启动应用程序,则应用程序运行良好,但是由于传入请求而由IIS启动时,应用程序不会运行。 IIS使用帐户“Internet来宾帐户…(… IUSR)”(我们假设)从简单的网页HTTP POST请求执行CGI应用程序。

我试图完全控制应用程序,DLL和文件夹,但没有喜悦的IUSR帐户。 接下来,我爆发了ProcMon,并寻找“ACCESS DENIED”结果。 我唯一能find的是CreateFile Desired Access:读属性,删除,同步,处置:打开,选项:同步IO非警报,C:\ WINDOWS \ Debug \ UserMode \ ChkAcc.log

这是令人费解的,因为我的应用程序不写入该日志文件(我假设IIS是如此,为什么会有问题?)

接下来,我比较了ProcMon输出成功的pipe理员启动和IUSR启动,发现“ReadFile”操作在失败的启动中不存在。 我没有得到一个访问被拒绝的错误,操作只是不会发生。

cl32.dll的sequntial操作的顺序应该是:QueryOpen CreateFile CreateFileMapping QueryStandardInformationFile CreateFileMapping CreateFileMapping CloseFile Load Image ReadFile

我假设这是DLL被加载到内存使用的地方。

取代ReadFile操作(在失败的发射中)有:RegOpenKey HKU \ S-1-5-21-4122272316-1273673783-4216733774-1003 NAME NOT FOUND

它有点像这里描述的“绕道遍历检查”问题http://forums.iis.net/t/1153139.aspx http://technet.microsoft.com/en-us/library/cc739389(WS.10 ).aspx但是没有解决问题。

在这一点上,我们已经超出了我对用户帐户和权限知识的极限了。 有一点很清楚,这是一个权限问题。 问题是,哪个权限?

添加

将ISUR添加到pipe理员:1.右键单击桌面上的我的电脑,然后单击pipe理。 2.打开“计算机pipe理”窗口后,展开“本地用户和组”。3.select“组”,然后双击右侧窗格中的“pipe理员”。 4.单击添加button5.单击高级,然后查找并selectIUSR 6.单击确定。 7.重新启动IIS

这并没有解决这个问题。 我挖了Filemon v7.3,它是IUSR

er.exe:2240 OPEN C:\WINDOWS\system32\USERENV.dll SUCCESS Options: Open Access: 00100021 er.exe:2240 CLOSE C:\WINDOWS\system32\USERENV.dll SUCCESS er.exe:2240 OPEN C:\WINDOWS\debug\UserMode\ChkAcc.log ACCESS DENIED MY-SERVER\IUSR_MY-SERVER er.exe:2240 CREATE C:\WINDOWS\debug\UserMode\ChkAcc.log ACCESS DENIED MY-SERVER\IUSR_MY-SERVER 

在这一点上,在这个黑暗的许可,这可能是什么:)

添加

我更改了文件ChkAcc.log和文件夹UserMode的权限,我也检查了高级权限,发现应用程序和Dll的拒绝。 我删除了他们两个。 我重新启动IIS,甚至重新启动机器。 仍然没有运气。

我想知道ACCESS DENIED是否是事实上的问题。 我重写了应用程序来创build和写入该文件夹中的文件,它的工作原理:

 OPEN C:\WINDOWS\debug\UserMode\ChkAcc.txt SUCCESS Options: OpenIf Access: 00120196 SET INFORMATION C:\WINDOWS\debug\UserMode\ChkAcc.txt SUCCESS Length: 0 SET INFORMATION C:\WINDOWS\debug\UserMode\ChkAcc.txt SUCCESS Length: 0 WRITE C:\WINDOWS\debug\UserMode\ChkAcc.txt SUCCESS Offset: 0 Length: 41 WRITE C:\WINDOWS\debug\UserMode\ChkAcc.txt SUCCESS Offset: 41 Length: 2 SET INFORMATION C:\WINDOWS\debug\UserMode\ChkAcc.txt SUCCESS Length: 43 SET INFORMATION C:\WINDOWS\debug\UserMode\ChkAcc.txt SUCCESS Length: 43 CLOSE C:\WINDOWS\debug\UserMode\ChkAcc.txt SUCCESS 

这使我怀疑文件夹权限根本就不是问题,但由于某种原因,DLL无法初始化。

有没有办法给予IUSR与ADMIN相同的权限? 那么也许我可以逐个删除它们。 也许我甚至可以创build第二个具有ADMIN权限的用户,让IIS使用这个来代替传入的CGI请求的IUSR?

清楚地将IUSR添加到ADMIN组与执行ADMIN的应用程序不同。

添加

其实这个问题原来是由于dll在启动时执行了各种健全性检查testing,包括读取文件的能力。 要做到这一点,它试图读取用户的主目录(或在Windows中用户的个人资料目录)

在Windows 2003 Server的testing框中,我发现

IUSR

CSIDL_APPDATA = C:\ WINDOWS \ system32 \ config \ systemprofile \ Application Data

pipe理员

CSIDL_APPDATA = C:\ Documents and Settings \ Administrator.MY-SERVER \ Application Data

我怀疑cgi进程被拒绝访问任何system32文件夹。 这是我期望的行为,直到IUSR被添加到pipe理员,然后我希望这个工作….但它没有。 解决的办法是重新编写DLL,但我仍然为此感到困惑

注意你有两行:

 er.exe:2240 OPEN C:\WINDOWS\debug\UserMode\ChkAcc.log ACCESS DENIED MY-SERVER\IUSR_MY-SERVER er.exe:2240 CREATE C:\WINDOWS\debug\UserMode\ChkAcc.log ACCESS DENIED MY-SERVER\IUSR_MY-SERVER 

第一行可能是应用程序检查它是否存在,而第二行是“创build文件如果不存在”的情况。 我要寻找的是,IUSR账户不是“USERS”组的一部分,而是“GUESTS”的一部分,一般来说客人的权限比“USERS”更less。 您可能需要确保IUSR帐户能够移动上面的文件夹。 尝试给IUSR帐户明确的访问权限遍历文件夹和“UserMode”文件夹的权限“创build文件”(但“仅此文件夹”)。

最后,对于可能阻止您访问文件夹的来宾,可能会有明确的“拒绝”权限。 那些是我要检查的东西。