I have a powershell script that works fine if I run it from an admin powershell. However, if I call on the powershell script in a c program, ran as admin, using the system() function, some parts of it do not work. More specifically the copy unattend.xml, and sysprep.exe commands. I have posted the powershell script and the c program script. How can I get this to work?
POWERSHELL SCRIPT:
#Set working directory to scripts location.
$scriptpath = $MyInvocation.MyCommand.Path
$Switcheroo = Split-Path $scriptpath
Set-Location $Switcheroo
#Set error options
$Error.clear()
$ErrorActionPreference = “Inquire”
Write-Host "Running part 2."
#1
& "DISKPART" /s $Switcheroo\DskPrtRmv.txt
TIMEOUT /T 3
#2
if ($? -eq "True")
{
Copy-Item $Switcheroo\unattend.xml $env:windir\System32\Sysprep
TIMEOUT /T 3
#3
if ($? -eq "True")
{
SCHTASKS /Delete /TN "Switcheroo" /f
TIMEOUT /T 3
}
elseif ($? -ne "True")
{
Write-Host Failed to copy unattend.xml
exit (22)
}
#4
if ($? -eq "True")
{
rm log.txt
TIMEOUT /T 3
}
elseif ($? -ne "True")
{
Write-Host Failed to delete the schedued task
exit (32)
}
#5
if ($? -eq "True")
{
& "$env:windir\System32\Sysprep\sysprep.exe" /generalize /oobe /shutdown /unattend:unattend.xml
}
elseif ($? -ne "True")
{
Write-Host Failed to remove the log.txt
exit (42)
}
#6
if ($? -ne "True")
{
Write-Host Sysprep failed.
exit (52)
}
}
elseif ($? -ne "True")
{
Write-Host Failed to run DskPrtRmv
exit (12)
}
C CODE:
/*
* File: main.c
* Author: Andrew
*
* Created on June 1, 2012, 2:39 PM
*/
#include <stdio.h>
#include <stdlib.h>
FILE *fp;
int main()
{
printf("Switcheroo in progress...\n");
if ((fp=fopen("chk.bin", "rb")) == NULL)
{
//Run powershell script Part1.ps1 and set its return value to the int i variable.
int i = system("powershell -executionpolicy unrestricted -file \"Part1.ps1\"");
if (i == 0)
{
//Set up the log file that the computer will check upon reboot.
char buffer[2] = {'0'};
fp = fopen("chk.bin", "wb");
fwrite (buffer , 1 , sizeof(buffer) , fp );
}
else if (i != 0)
{
//Print the error returned from powershell script Part1.ps1
printf("Part1 Error: %d \n", i);
system("PAUSE");
}
}
else if (fp = fopen("chk.bin", "rb"))
{
//Run powershell script Part2.ps1 and set its return value to the int j variable.
int j = system("powershell -executionpolicy unrestricted -file \"Part2.ps1\"");
if (j == 0)
{
printf("Switcheroo has finished successfully.\n");
remove("chk.bin");
}
else if (j != 0)
{
//Print the error returned from powershell script Part2.ps1
printf("Part2 Error: %d \n", j);
system("PAUSE");
}
}
}
What is the architecture of operating system on the computer on which your are testing ?
When you compile your
Cprogram do you target 32 bits or 64 bits exe ?Your trouble can be explained by the fact that your OS is 64 bits and your program 32 bits, so it executes a 32 bits version of PowerShell and this generates some trouble.
If so, you can solve your problem spawning a 64 bits PowerShell from a 32 bits C exe using.