Using Win32's ::CopyFile to retrieve file from Symantec Enterprise Vault - winapi

I'm having a problem copying a file from a Symantec Enterprise Vault. Usually, I use the Win32 ::CopyFile function to copy from one NTFS to another. Now, the NTFS has a special symbolic link or shortcut. If you access the shortcut via Windows Explorer, the Symantec service intercepts the request and recovers the full file for you. This does not seem to happen when using the API call. It appears that the retrieval is occurring, but the API call doesn't wait for it to complete.
Is there a method for interacting with these special shortcuts programmatically?

I assume by IE you mean "Windows Explorer" and NOT "Internet Explorer"...
IF Symantec just intercepts so-called "shell operation" as your description suggests
then you need to use SHFileOperation for that...
see
http://msdn.microsoft.com/en-us/library/bb762164%28v=vs.85%29.aspx
depending on your OS it could be better to use IFileOperation
http://msdn.microsoft.com/en-us/library/bb775771%28v=vs.85%29.aspx
BOTH methods behave exactly as if the copy operation was handled by Windows Explorer (for example when you copy a file manually) thus would engage the Symantec Intercept in the same manner...

Enterprise Vault has it's own API, called the ECMAPI that allows you to interact with placeholders.
Unfortunately you have to be a member of the STEP program, which costs about $30,000 per year.
There are Symantec Partners, like QUADROtech and bluesource, who might be able to help you. QUADROtech do lots on the coding side of things.

Related

Automating remote desktop connection

We use many remote desktops in our development environment and there are many servers deployed in multiple environments. It is tedious to remember their IP addresses, usernames, and passwords. I want to write a small utility with buttons on it. When clicked, I want to start those remote desktops, automatically fetching usernames and passwords from some list.
I know there is a command line equivalent for MS Remote Desktop: mstsc.
This question suggests to do this as follows:
cmdkey /generic:TERMSRV/"computername or IP address" /user:"username" /pass:"password"
mstsc /v:"computer name or IP"
I run the first line, and it says credential successfully added. Then when I run the second line it simply runs Remote Desktop Connection for the specified IP address and asks for username and password. I would like it to simply open the remotely connected desktop at specified IP address by automatically applying the credential specified in cmdkey.
What's wrong here? Is it possible using such PowerShell script?
Can I invoke this script through an HTML page (since there are many other resources that I will be laying onto the webpage which will serve as one spot links for we developers, so that we will not be wasting time and effort finding them each time we want them)? Is it possible by registering the application to a URI scheme?
Is there another (standard) way?
The problem in your attempt is the parameter /generic.
According to the official website for cmdkey, /generic
identifies the computer or domain name that this entry will be associated with.
In my example, I will call the computer Computer01.
Do you want the credentials associated with TERMSRV/Computer01 ? (Like your example /generic:TERMSRV/"computername or IP address " said)
No, you want it associated to the normal computername Computer01.
Then you have to remove TERMSRV/.
The working result is:
cmdkey /generic:"computername or IP" /user:"username" /pass:"password"
To your other questions:
See the answer above
I don't know if it's possible with HTML only. I don't think so. But I also implement some PowerShell scripts into ASP.NET. This works.
See answer above.
A lot has changed since 2013. Many system operators already suggested to use ready-made tools which does this. Back in year 2013, Windows store wasn't that great a place (*my opinion). But now it's OK.
There is Microsoft's own Remote Desktop application in the store. The application is universal, that is, it runs on PCs, mobile phones, and holographic devices.
What's good? Microsoft has made the same app available on Android. I have tried for PC and Android. Both work great.
So have a try. I am regular user of these applications now.

Doing a virus check on a file from a build script

I would like to be be able to invoke a virus check as the final stage of the build process (please don't question why a dev machine would get a virus, it's just a belt-and-braces approach to avoid the risk of getting sued by customers...). Also I'd like the option of having AV on a machine but switching the auto file system protection off (at least for the build directories).
What I would like is a generic way of scanning a file using whatever AV system is in place. I'm assuming that there's an Windows API to do this, given that Windows detects the presence of an AV system, and browsers such as Firefox invoke a virus scan whenever a file is downloaded. So what's the API that they're using? There's the Microsoft AntiVirus API but that seems to be specific to Office documents. Does the approach involve using WMI? (and if you can detect the AV provider from there, how do you then invoke it to scan a file?)
I know that I could write the script to manually call the AV scanner that I know to be installed, but as an intellectual exercise I'm more interested to know how apps like Firefox are doing this.
Well, you may want to take a look at the nsDownloadScanner system directly on the Firefox source code:
nsDownloadScanner.h
nsDownloadScanner.cpp
As told by the comments on that files:
Download scanner attempts to make use of one of two different
virus scanning interfaces available on Windows - IOfficeAntiVirus
(Windows 95/NT 4 and IE 5) and IAttachmentExecute (XPSP2 and up).
The latter interface supports calling IOfficeAntiVirus internally,
while also adding support for XPSP2+ ADS forks which define security
related prompting on downloaded content.
Documentations on those interfaces can be found here:
IAttachmentExecute
IOfficeAntiVirus
If your software is open-source is compliant with the MPL licence (thanks, #MSalters), you may also directly use Firefox' code, to avoid reinventing the wheel.
Firefox uses the IAttachmentExecute API. However, you don't want to use that in a build script since it will add alternate stream information telling windows to show an annoying warning window when executing the file.

Saving Data to Registry on Windows 7

I heard that Windows 7 restricts access to its registry, so that applications cannot write directly to it. Is this so? I am developing an application in C#, and I would like to be able to save things such as port settings, last file used, etc. between sessions. Is the registry still a good option, or is there another preferred means of doing this now? Thanks.
Access to the registry has been restricted since (at least) Windows NT 4. That does not mean that you cannot write to it; it just means that you cannot write to it everywhere. Normally, writing in HKEY_CURRENT_USER should still be possible.
The registry is still a good option for storing settings. However, you can also save yourself some work and use "application settings" instead, which are stored in an XML file in the user's profile folder. Here I asked what their advantage was over the registry, resulting in a great discussion of the pros and cons of each.

How do I remotely obtain a system's network shares and connections?

I'm looking for a way to obtain information similar to the following console applications, remotely:
net use
net share
netstat -ano
However, I need to be able to do this without running a 3rd party application on the system. This effectively rules out using psexec to execute the command remotely, because psexec would then be installed as a service.
I should add that I have administrative credentials on the remote system. I've considered using WMI's remote execution ability, but that requires me to write output to a file and then retrieve it. It's possible, but I'd like to know if anyone has a better way.
I am using Delphi 2010.
there are a couple Delphi WMI components that allow remote access. I have not used the remote options personally though.
MagWmi - http://www.magsys.co.uk/delphi/magwmi.asp (Delphi 2010 support, and free with source)
WMISet/NTSet - http://www.online-admin.com/ntset.html (TNTShare
Manages shared resources on a local computer and remote hosts. Using this component you can change list of shared devices, see files that have been opened by remote users, watch and terminate remote sessions opened to the destination computer, change list of mapped network drives. It is not free.)
GLibWMI - Found at Torry.net, home page not available. (Delphi 2010 support and Freeware with source). Not sure if its capable of remote access. I have not used it.
Hope this helps
I think the same as Logman.
You can access this information using WMI.
GLibWMI components can be found on this website (http://neftali.clubdelphi.com) or sourceforge (http://sourceforge.net/projects/glibwmi/).
The current version is 1.8b and has a component called SharedInfo with which you can get that information.
The source code is available so you can expand it to access other WMI classes if necessary.
Regards.
P.D: Sorry for my mistakes with english.
You can enumerate shares using the NetShareEnum function (headers are in the Jedi Apilib).
I assume there must be an api for the "net use" but I have never used it (check the WNet functions). Alternative is to use the EnumNetworkDrives method of the WshNetwork com object.
As for netstat I don't think it's possible to do that remotely (other than using some kind of method to spawn a process remotely).

How do I update a VB6 app from XP to Vista?

I work on a vb6 application which is having problems with Vista, for the obvious reasons (writing to program files, and other things that are no longer allowed by default).
Where should I store application data or user's saved files?
Do I need priviledges to create folders and files, there, too?
What other common actions will cause problems?
The program has an updater which must download and register files, how do I elevate priviledges when this occurs?
Some of these questions have obvious answers, but I want to get the obvious stuff right.
Depending upon what you are doing, you might be in for a world of pain. There are no hard and fast answers to any of those questions, but from someone who is going through the same issues right now, here's what I know.
1) Where should I store application data or user's saved files?
This depends on what you are wanting to do. If you want them per user, store them in Users/AppData, if you want them for all users, store them in Common/AppData
If SHGetFolderPath(0, CSIDL_COMMON_APPDATA, -1, SHGFP_TYPE_CURRENT, sTempPath) = 0 Then
sCommonAppdata = Left$(sTempPath, InStr(1, sTempPath, Chr(0)) - 1) & "CompanyName\AppName"
End If
Change that to CSIDL_APPDATA for the Users AppData directory. Note: These map to totally different places on the filesystem for XP and Vista so when you are debugging prepare to look in different places.
2) Do I need priviledges to create folders and files, there, too?
You need Adminsitrator access to write anything in Program Files, if at all possible don't do it! We are currently running into issues that the API's for VB and the standard API's behave differently on files in Program Files.
3) What other common actions will cause problems?
There are lots of hidden gotchas. Just to name a few, you cannot communicate through IPC or Named Pipes to other applications (we have a Service that we were talking to through a Tray Notification Icon and that had to be completely re-written). Anything were you see a UAC notification is very difficult. Also you cannot write to anything in the Registry in LOCAL_MACHINE without Administrator, so you either have to stick to LOCAL_USER or raise credentials (see below).
4) The program has an updater which must download and register files, how do I elevate priviledges (sic) when this occurs?
Good luck with this, I highly recommend that you don't write it in VB6, like I said, the VB6 file api's appear to access files differently from the standard API's. If you need to elevate privileges see this post that someone kindly helped me with.
In the sort term turning off UAC and installing the ActiveX installer server will help. Long term you need to put data and configuration information in the users directory under \users or in \programdata.
In the short run it might not be necessary at all to modify your application, because
Vista comes with a set of compatibility options to allow legacy applications to run. This includes file and registry virtualization, a feature which basically redirects write operations to protected folders such as C:\Program Files to a virtual location only visible for the specific application running in a compatibility mode.
Some more details are mentioned in this article: How To Manage Windows Vista Application Compatibility in Dr. Dobb's.
Karl Peterson wrote a nice article on where to store user data & app data, with a VB6 class that retrieves the location of the special paths for you.

Resources