The only way to do this IMO without the use of 3rd party utils (such as NirCmd and Wizmo) would be via VBScript or PowerShell. All the VBScript solutions I've seen so far use an outdated Windows Media Player OCX. I don't know whether the latest versions of WMP include an OCX with similar functionality or not, plus disabling/uninstalling it via Windows Features might interfere with the functioning of the script in any case.
A common way to implement this functionality via code is by using the Media Control Interface (MCI) APIs (specifically, the set command). However, since VBScript does not support calling normal Windows API functions or even functions from arbitrary DLLs, that leaves us with PowerShell. Thus the following should work out of the box in Windows 7+ that comes with PS pre-installed, and on XP/Vista after PS is installed. The MCI DLL i.e. Windows\System32\WinMM.dll should be available as part of the default installation in XP+.
1) Save the following as CD_Open.ps1:
$cd = Add-Type -memberDefinition @"
[DllImport("winmm.dll", CharSet = CharSet.Ansi)] public static extern int mciSendStringA(string lpstrCommand, string lpstrReturnString, int uReturnLength, IntPtr hwndCallback);
"@ -passthru -name mciSendString
$cd::mciSendStringA('set cdaudio door open', $null, 0, 0);
2) Save the following as CD_Close.ps1:
$cd = Add-Type -memberDefinition @"
[DllImport("winmm.dll", CharSet = CharSet.Ansi)] public static extern int mciSendStringA(string lpstrCommand, string lpstrReturnString, int uReturnLength, IntPtr hwndCallback);
"@ -passthru -name mciSendString
$cd::mciSendStringA("set cdaudio door closed", $null, 0, 0);
Now comes the problem. By default, unsigned PS scripts cannot be executed in Windows for security reasons. Type get-help about_signing
at the PS prompt to know more about this, including how to self sign your scripts and so on.
Luckily there's a workaround as the get-help command above states:
TO PERMIT SIGNED SCRIPTS TO RUN
-------------------------------
When you start Windows PowerShell on a computer for the first time, the
Restricted execution policy (the default) is likely to be in effect.
The Restricted policy does not permit any scripts to run.
To find the effective execution policy on your computer, type:
get-executionpolicy
To run unsigned scripts that you write on your local computer and signed
scripts from other users, use the following command to change the execution
policy on the computer to RemoteSigned:
set-executionpolicy remotesigned
For more information, see Set-ExecutionPolicy.
3) So from an elevated Command Prompt, run the following command:
powershell set-executionpolicy remotesigned
(You can run powershell set-executionpolicy restricted
to revert to the default setting.)
This command needs to be run only once and remains in effect until you change the execution policy again.
4) Now you can use the following commands (even from a non-elevated Command Prompt) to open/close the optical drive tray:
powershell -file CD_Open.ps1
powershell -file CD_Close.ps1
Of course, you can create shortcuts as well so that you can open/close the tray with a click or a key combo:
You can also add the Close command to the context menu of your optical drive using the following .REG file:
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\SystemFileAssociations\Drive.CDROM\shell]
@="none"
[HKEY_CLASSES_ROOT\SystemFileAssociations\Drive.CDROM\shell\closetray]
@="Close"
[HKEY_CLASSES_ROOT\SystemFileAssociations\Drive.CDROM\shell\closetray\command]
@="C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\Powershell.exe -windowstyle hidden -file I:\\CD_Close.ps1"
(Edit the paths as required. Also, the -WindowStyle parameter is only available with PS 2.0+.)
Best Answer
In the early days of USB, things were pretty flaky and you were likely to blue-screen your computer if you unplugged a USB connection without due care.
USB is now far more robust and reliable and you are unlikely to have those types of problem. However, there is also the quite separate question of caching.
When writing data to a USB device, caching is likely to be used to boost overall performance. This means that you may think your file copying has completed, but part of the file is still in memory and is still being written to the USB device. For this reason, the safe removal function is still very necessary. If you unplug a USB device while it is being written to, you are very likely to corrupt your file and possibly also damage the USB device.
The safe removal function ensures that the data transfer to the USB device completes and the file is closed, so that you know when you can remove the USB device without corrupting your data or damaging your devices.
(If you want to find out what process is accessing the USB device, you may use the Sysinternals handle utility.)