param (
[string]$DomainName = "contoso.com",
[string]$SvcUsername = "svc_websql01",
[string]$SvcPassword = "Svc1234!"
)
$scriptName = $MyInvocation.MyCommand.Name
$logFile = "C:\Logs\${scriptName}_log.txt"
$NetBiosName = $DomainName.Split(".")[0].ToUpper()
$wwwroot1 = "C:\inetpub\wwwroot"
$wwwroot2 = "C:\inetpub\wwwroot2"
$wwwroot3 = "C:\inetpub\wwwroot3"
Start-Transcript -Path $logFile -Append
# --- IIS Setup ---
try {
Install-WindowsFeature -Name Web-Server -IncludeManagementTools
Install-WindowsFeature -Name Web-Asp-Net45
Write-Host "[INFO] Installed IIS and ASP.NET"
} catch {
Write-Host "[ERR] Failed to install IIS and ASP.NET"
}
# Upload form content
@"
using System;
using System.IO;
using System.Web.UI;
public partial class UploadPage : Page
{
protected void UploadFile(object sender, EventArgs e)
{
if (fileUpload.PostedFile != null && fileUpload.PostedFile.ContentLength > 0)
{
try
{
string filename = Path.GetFileName(fileUpload.PostedFile.FileName);
fileUpload.PostedFile.SaveAs(Server.MapPath(filename));
lblMessage.Text = "File uploaded successfully!";
}
catch (Exception ex)
{
lblMessage.Text = "Error: " + ex.Message;
}
}
else
{
lblMessage.Text = "Please select a file to upload.";
}
}
}
"@ | Out-File "$wwwroot1\upload.aspx.cs" -Force
@"
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="upload.aspx.cs" Inherits="UploadPage" %>
File Upload Page
"@ | Out-File "$wwwroot1\upload.aspx" -Force
@"
"@ | Out-File "$wwwroot1\Web.config" -Force
# Default site - port 80
try {
New-WebSite -Name "MyASPXSite" -Port 80 -PhysicalPath $wwwroot1 -ApplicationPool "DefaultAppPool"
Set-ItemProperty "IIS:\AppPools\DefaultAppPool" -Name processModel -Value @{userName="$SvcUsername";password="$SvcPassword";identityType=3}
New-NetFirewallRule -DisplayName "HTTP (80)" -Direction Inbound -Protocol TCP -LocalPort 80 -Action Allow
Restart-WebAppPool -Name "DefaultAppPool"
Write-Host "[INFO] Site 1 created on port 80"
} catch {
Write-Host "[ERR] Failed to create site 1"
}
# ACLs for wwwroot1
try {
$svcRule = New-Object System.Security.AccessControl.FileSystemAccessRule("$DomainName\$SvcUsername", "Modify", "ContainerInherit,ObjectInherit", "None", "Allow")
$acl = Get-Acl $wwwroot1
$acl.SetAccessRule($svcRule)
Set-Acl -Path $wwwroot1 -AclObject $acl
Write-Host "[INFO] ACL set for $wwwroot1"
} catch {
Write-Host "[ERR] Failed to set ACL for $wwwroot1"
}
# Second site - port 8080
try {
Copy-Item $wwwroot1 -Destination $wwwroot2 -Recurse -Force
New-WebAppPool -Name "DefaultAppPool2"
New-WebSite -Name "MyASPXSite2" -Port 8080 -PhysicalPath $wwwroot2 -ApplicationPool "DefaultAppPool2"
Set-ItemProperty "IIS:\AppPools\DefaultAppPool2" -Name processModel -Value @{identityType=2}
New-NetFirewallRule -DisplayName "HTTP (8080)" -Direction Inbound -Protocol TCP -LocalPort 8080 -Action Allow
$acl = Get-Acl $wwwroot2
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule("IIS_IUSRS", "Modify", "ContainerInherit,ObjectInherit", "None", "Allow")
$acl.SetAccessRule($rule)
Set-Acl -Path $wwwroot2 -AclObject $acl
Restart-WebAppPool -Name "DefaultAppPool2"
Write-Host "[INFO] Site 2 created on port 8080"
} catch {
Write-Host "[ERR] Failed to create site 2"
}
# SQL Server Express setup
try {
New-Item -Path "C:\setup\media" -ItemType "Directory" -Force
@"
;SQL Server Configuration File
[OPTIONS]
IACCEPTSQLSERVERLICENSETERMS="True"
ACTION="Install"
ENU="True"
QUIET="True"
FEATURES=SQLENGINE,FULLTEXT
INSTANCENAME="SQLEXPRESS"
SQLSVCACCOUNT="NT AUTHORITY\NETWORK SERVICE"
SQLSYSADMINACCOUNTS="BUILTIN\Administrators"
ADDCURRENTUSERASSQLADMIN="True"
TCPENABLED="1"
NPENABLED="0"
SAPWD="$SvcPassword"
"@ | Out-File "C:\setup\sql_conf.ini"
Start-Process -FilePath "C:\setup\SQL2019-SSEI-Expr.exe" -ArgumentList "/configurationfile=C:\setup\sql_conf.ini /IACCEPTSQLSERVERLICENSETERMS /MEDIAPATH=C:\setup\media /QUIET" -Wait
Set-ItemProperty -Path "HKLM:\Software\Microsoft\Microsoft SQL Server\MSSQL15.SQLEXPRESS\MSSQLServer\SuperSocketNetLib\Tcp\IPAll" -Name "TcpPort" -Value "1433"
Restart-Service -Name "MSSQL`$SQLEXPRESS"
New-NetFirewallRule -DisplayName "SQLServer 1433" -Direction Inbound -LocalPort 1433 -Protocol TCP -Action Allow
$env:Path += ";C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\170\Tools\Binn"
SqlCmd -E -Q "CREATE LOGIN [$NetBiosName\$SvcUsername] FROM WINDOWS"
SqlCmd -E -Q "SP_ADDSRVROLEMEMBER '$NetBiosName\$SvcUsername', 'SYSADMIN'"
SqlCmd -E -Q "ALTER LOGIN sa ENABLE"
SqlCmd -E -Q "ALTER LOGIN sa WITH PASSWORD = '$SvcPassword', CHECK_POLICY=OFF"
Write-Host "[INFO] SQL Server installed/configured"
} catch {
Write-Host "[ERR] SQL Server setup failed"
}
# Third site - port 9090 with upload + SQL query page
try {
Copy-Item $wwwroot1 -Destination $wwwroot3 -Recurse -Force
New-WebAppPool -Name "SqlQueryAppPool"
New-WebSite -Name "SqlQuerySite" -Port 9090 -PhysicalPath $wwwroot3 -ApplicationPool "SqlQueryAppPool"
Set-ItemProperty "IIS:\AppPools\SqlQueryAppPool" -Name processModel -Value @{userName="$SvcUsername";password="$SvcPassword";identityType=3}
New-NetFirewallRule -DisplayName "HTTP (9090)" -Direction Inbound -Protocol TCP -LocalPort 9090 -Action Allow
# SQL Query Page
@"
<%@ Page Language="C#" Debug="true" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
SQL Query Tester
Enter a SQL Query
"@ | Out-File "$wwwroot3\sqlquery.aspx" -Force
Restart-WebAppPool -Name "SqlQueryAppPool"
Write-Host "[INFO] Site 3 created on port 9090 with SQL query page"
} catch {
Write-Host "[ERR] Failed to create SQL query site"
}
Stop-Transcript