У меня есть приложение exe, которое я запускаю на IIS (из C:\inetpub\wwwwroot
в DefaultAppPool
) и ему требуется доступ к реестру, но он не работает, похоже, у него нет разрешения. Что странно, я запустил его в Windows 8, и он отлично работает, но на хостах Windows 7 и Server 2012 он не работает. Я знаю, что у ключей реестра есть разрешения, и я даже пытался установить Everyone
к полному контролю, но все равно не получается. Я также пробовал оба HKEY_CURRENT_USER
и HKEY_LOCAL_MACHINE
, не повезло.
Я читал о уровни доверия но я не уверен, что это, единственные ссылки, которые я мог найти, связанные с приложениями ASP. Есть ли что-то, что мне нужно добавить в web.config или в консоль управления IIS, чтобы мое приложение CGI могло получить доступ к реестру, в идеале под HKCU?
Редактировать: Пытался посмотреть, что происходит с Process Monitor, но я не вижу ни строчки об этом. Однако я написал этот быстрый Perl-скрипт, чтобы воспроизвести это:
use strict;
use Win32API::Registry qw (:ALL);
print "Content-type: text/plain\n\n";
RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\TestingRegistryAccess", 0, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, [], my $rh, []) or print regLastError();
if(defined($rh)) { RegCloseKey($rh); }
И вывод:
Access is denied.
Так что должно быть некоторые способ разрешить CGI-скрипту получить к нему доступ, он работает на моем рабочем столе Win8.
После часы работая над этим, я понял, что разрешения реестра не имеют значения, когда дело доходит до сценариев CGI, даже с Все имея Полный доступ IIS по-прежнему блокирует его. Единственный способ, которым веб-приложение может получить доступ к реестру, - это запустить его как обычный пользователь, а не как IUSR.
Я написал пакетный сценарий, который назначает имя пользователя / пароль виртуальным каталогам, создает виртуальный каталог для моего веб-приложения и позволяет приложению запускаться:
@echo off
set /p id="Username: "
set /p pass="Password: "
%windir%\system32\inetsrv\appcmd set site "Default Web Site" -virtualDirectoryDefaults.userName:%id% -virtualDirectoryDefaults.password:%pass%
%windir%\system32\inetsrv\appcmd add vdir /app.name:"Default Web Site/" /path:/nodepoint /physicalPath:"%CD%"
%windir%\system32\inetsrv\appcmd set config -section:isapiCgiRestriction /+[path='%CD%\app.exe',allowed='true',description='Web App']
Надеюсь, это будет полезно и другим.