Thread View: borland.public.cppbuilder.nativeapi
3 messages
3 total messages
Started by Clayton Arends
Thu, 10 May 2007 21:29
Vista and odd behavior in ActiveX launched via IE with User Account
Author: Clayton Arends
Date: Thu, 10 May 2007 21:29
Date: Thu, 10 May 2007 21:29
116 lines
5791 bytes
5791 bytes
I have encountered a problem on Vista with one of my company's applications.
Internet Explorer seems to be "sandboxing" an ActiveX control that we've
written denying it the ability to create files in the OS. Has anyone else
seen this behavior and know of how to work around it?
Here is a complete description.
Background:
A user will connect via a web browser to launch one of our client
applications. The web page has an embedded ActiveX control (an Active Form)
that is served by the web server via a signed CAB. We call this ActiveX app
our "Universal Client Launcher". The param tags on the web page inform the
launcher of what client needs to be run.
When the launcher opens it connects to a server to check for the current
installed version of a client. If the current version doesn't exist on the
user's machine it is downloaded and extracted to the user's application data
directory. Then the client is launched. In our current implementation the
clients are all Win32 EXE applications.
What works:
This scenario has been working flawlessly with XP (2000 and Win98 worked
with an earlier version of this scenario but we haven't tested it recently).
For systems where the users have limited privileges (ie, they can't install
ActiveX controls) the system admin needs to install the launcher for them.
From that point the user can get the latest versions of our clients as they
become available. And because the launcher rarely changes the system admin
is hardly ever involved in the process after the initial install.
The problem:
With Vista the administrator is able to install our ActiveX launcher without
problem. The administrator can also install and launch any one of our
client applications. A user can also launch our ActiveX launcher. The
problem happens when the client is extracted and executed. The OS claims
that the files exist on the user's system. However, checking the
appropriate directories the files do not exist. When the launcher opens the
application, ShellExecute() returns an error code of 5
(SE_ERR_ACCESSDENIED).
Sample code:
Following is a modified version of the launcher. I have provided enough
code here to show the logic flow and the main functions that we use.
String prodPath = ConstructFileName(GetSpecialFolder(CSIDL_APPDATA),
"OurCompany\\" + ApplicationName + "\\" + Version);
if (!DirectoryExists(prodPath)) // (A)
{
// Create the directory to place the files
if (!ForceDirectories(prodPath))
throw Exception("Couldn't create path: " + prodPath);
// Download and extract the files to 'prodPath'
// ... internal stuff
}
// Determine the EXE name to run
String exeName = // ... internal stuff
if (!FileExists(exeName)) // (B)
throw Exception("EXE doesn't exist: " + exeName);
int res = reinterpret_cast <int> (::ShellExecute(NULL, NULL,
exeName.c_str(), parameters.c_str(), prodPath.c_str(),
SW_SHOWNORMAL));
if (res <= 32)
{
RaiseLastOSError();
}
ConstructFileName() is a function that correctly appends argument two to the
end of argument one for use as a folder or file name. GetSpecialFolder() is
a function that makes calls to SHGetSpecialFolderLocation(), etc to retrieve
the full path to a special system folder. On my XP development machine
'prodPath' contains:
c:\Documents and Settings\username\Application Data\
OurCompany\appname\version
On our test Vista machine 'prodPath' contains:
c:\Users\username\AppData\Roaming\OurCompany\appname\version
The first time the launcher runs the 'prodPath' doesn't exist. The line
marked (A) evaluates to true. This results in the files being downloaded
and extracted into 'prodPath'. At line (B) the file check evaluates to
false (meaning the file exists) and ShellExecute() is called returning 5.
RaiseLastOSError() throws the following exception:
System Error. Code: 5.
Access is denied.
If I run the launcher again this time when it reaches (A) the evaluation
results in false (the directory does exist). The files are not extracted
again. Line (B) results in false again and ShellExecute() produces the same
result. A quick peek at the file system shows that the directory
"c:\Users\username\AppData\Roaming\OurCompany" does not exist and therefore
neither do any of the sub directories or files.
What else I've tried:
I created a test application that loads the ActiveX control. This
application represents the part that IE would be playing. The ActiveX
launches, retrieves the files, and runs the client just fine. So, it would
seem that the ActiveX control running in IE has limited permissions or the
operations are somehow being "sandboxed".
Has anyone encountered a situation such as this with Vista yet and know of
any solution?
BCB6 Pro
- Clayton
Re: Vista and odd behavior in ActiveX launched via IE with User Account
Author: Clayton Arends
Date: Thu, 10 May 2007 21:48
Date: Thu, 10 May 2007 21:48
16 lines
1697 bytes
1697 bytes
First, sorry for posting in b.p.c.nativeapi. Perhaps the question would have been better asked in b.p.c.activex. Second, as I investigated the issue more I found the new "Enable protected mode" checkbox in IE's "Tools | Options | Security" dialog. This option was hiding in plain sight so you can understand why I didn't see it before ;-). By unchecking this check box my launcher is now able to successfully retrieve, write, and launch the client applications. However, now IE complains that the user is surfing "unprotected". I looked for an option to selectively allow certain trusted ActiveX controls to run "unprotected" but couldn't find such an option. If somebody knows of an option like that or any other solution to this problem I would be grateful. - Clayton
Re: Vista and odd behavior in ActiveX launched via IE with User Account
Author: Clayton Arends
Date: Sat, 12 May 2007 00:13
Date: Sat, 12 May 2007 00:13
22 lines
1945 bytes
1945 bytes
The solution we seem to be leaning toward is to have our customers place the website that serves the OCX in their "Trusted Sites" zone. This works and doesn't nag the user when they are navigating the site unprotected. What I have been investigating is how to make the OCX become a "broker shim" (I think that's how to say it). This way whenever it's launched by a user account the OCX will be able to have medium access rights and write to the user's appdata directory. My initial tests of this method have not been successful. Using the admin account I added a key to: HKLM\SOFTWARE\Microsoft\Internet Explorer\Low Rights\ElevationPolicy The key was named with the CLSID of my ActiveX control and I added the following two values: CLSID [REG_SZ] = my activex control's CLSID Policy [REG_DWORD] = 2 This will probably be the final post I have in this thread unless I get this working (or someone else gives their 2 cents). - Clayton
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads