pritaeas
asked on
why is exec ('xcopy /o') not working ?
Hi.
To support automated installations on Windows 2003 Server running PHP 4.4.1, I need a script to copy a basedir. The code exec ('xcopy \\base \\newdir') with a lot of commandline options works just fine. The only exception is the parameter /o which is supposed to copy the correct rights to the new directory. I need this so I can set the correct rights on the basedir (cachedir needs write permissions, and so on). I've not yet been able to solve this, or find more information about this. How can I get PHP to set the correct rights (preferrably using xcopy) ? Any other way that works is also acceptable.
To support automated installations on Windows 2003 Server running PHP 4.4.1, I need a script to copy a basedir. The code exec ('xcopy \\base \\newdir') with a lot of commandline options works just fine. The only exception is the parameter /o which is supposed to copy the correct rights to the new directory. I need this so I can set the correct rights on the basedir (cachedir needs write permissions, and so on). I've not yet been able to solve this, or find more information about this. How can I get PHP to set the correct rights (preferrably using xcopy) ? Any other way that works is also acceptable.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
I have all the params you mention. I'll have a look at robocopy and the permissions.
As long as I don't use /o the script works just fine. If I include /o the I get CGI Error. The specified application misbehaved by not returning a complete set of HTTP headers, and nothing is copied.
As long as I don't use /o the script works just fine. If I include /o the I get CGI Error. The specified application misbehaved by not returning a complete set of HTTP headers, and nothing is copied.
Can you try the script from the command line ?
Try adding some output buffering and saving that first.
<?php
echo 'About to start output buffering<br />';
ob_start();
exec("xcopy C:\\Source\\*.* D:\\Dest /Y /E /S /C /O /R", $a_output, $i_errorlevel);
print_r($a_output);
echo "Errorlevel : $i_errorlevel\n";
$s_output = ob_get_flush();
$fp = fopen('./xcopy.log', 'rt');
fwrite($fp, $s_output);
fclose($fp);
echo $s_output;
?>
Try adding some output buffering and saving that first.
<?php
echo 'About to start output buffering<br />';
ob_start();
exec("xcopy C:\\Source\\*.* D:\\Dest /Y /E /S /C /O /R", $a_output, $i_errorlevel);
print_r($a_output);
echo "Errorlevel : $i_errorlevel\n";
$s_output = ob_get_flush();
$fp = fopen('./xcopy.log', 'rt');
fwrite($fp, $s_output);
fclose($fp);
echo $s_output;
?>
ASKER
Tried robocopy and so the following in the output:
You do not have the Manage Audit user right.
That must be the problem, I'll look into it with the sysop here how to set this.
You do not have the Manage Audit user right.
That must be the problem, I'll look into it with the sysop here how to set this.
Aha!
ASKER
Looks like it is solved. I must do a final test to make sure. When I do, you get the points, for pointing me to robocopy. Excellent tool: using /SEC param solved my problem.
ROBOCOPY is a great tool. Once you get that working, you will probably find that xcopy /o will also work.
ASKER
No. xcopy /o still does not work. Robocopy /sec does. I think xcopy /o is equivalent to robocopy /copy:sou. I need only rights for /copy:s apparently.
Ok.
If you are copying a LOT of files, then using ROBOCOPY to create zero sized entries first is a good idea (so I've been told). It seems to work faster overall and results in less fragmentation.
If you are copying a LOT of files, then using ROBOCOPY to create zero sized entries first is a good idea (so I've been told). It seems to work faster overall and results in less fragmentation.
ASKER
Thanks for the info.
I would ask this question in the MS Networking / Security TA.
Do you get an error when you try to do the copy?
What is the exact command you are issuing?
Try something like ...
<?php
exec("xcopy C:\\Source\\*.* D:\\Dest /Y /E /S /C /O /R", $a_output, $i_errorlevel);
print_r($a_output);
echo "Errorlevel : $i_errorlevel\n";
?>
What is the output you get?