# התקנת הסוכן ב-Windows ללא חסימה — Smart App Control וחתימה דיגיטלית

## מה קרה?
בעת הרצת `vaidio-agent.exe` (או המתקין) קופץ:

> **Smart App Control blocked an app that may be unsafe**
> …was blocked because we can't confirm who wrote it and it's not an app we're familiar with.

זה **Smart App Control (SAC)** — רכיב ב-Windows 11 (22H2 ומעלה), **שונה מ-SmartScreen הרגיל**:

| | SmartScreen רגיל | Smart App Control |
|---|---|---|
| כפתור "Run anyway" | ✅ יש | ❌ **אין** — רק "Ok" |
| מה מתיר | קובץ עם מוניטין/חתימה | **רק** חתום בתעודה מהימנה *או* בעל מוניטין ענן מובהק |
| עוקף עם self-signed | חלקית | ❌ לא (דורש שרשור ל-Microsoft Trusted Root) |

**המסקנה החד-משמעית:** אין טריק תוכנה שעוקף SAC. אין גם דרך **חינמית** לגרום לבינארי לא-חתום
לעבור SAC מרחוק על כל מחשב — חתימה מהימנה עולה כסף. יש בדיוק שני פתרונות:

1. **כיבוי/הערכת SAC על המחשב עצמו** בזמן ההתקנה החד-פעמית → **חינמי, עובד עכשיו**. מתאים
   למחשבי GVSS (קיוסק/חנות שאנחנו מקימים בלאו הכי). ראה **המסלול החינמי** למטה.
2. **חתימה דיגיטלית מהימנה** של ה-exe והמתקין → רץ בכל מחשב בלי לגעת בהגדרות. **הפתרון הנכון
   למוצר בהפצה רחבה — בתשלום.** ראה "שדרוג עתידי" למטה. (לכשנשלם.)

---

## ⭐ המסלול החינמי (עכשיו) — `setup-agent.ps1`

לטכנאי GVSS שמקים מחשב חנות/קיוסק. סקריפט אחד עושה הכל ומטפל ב-SAC בלי תעודה:

```powershell
# PowerShell כ-Administrator, בתיקיית הסוכן:
.\setup-agent.ps1 -Token "<הטוקן ממסך המערכת>"
```
מה הוא עושה: (1) כותב `config.json` (כתיבה לא מריצה את ה-exe → SAC לא חוסם), (2) מסיר
"Mark of the Web" מה-exe (`Unblock-File`), (3) אם SAC חוסם — מכבה אותו, רושם השלמה
אוטומטית אחרי אתחול (`RunOnce` → `install-task.ps1`) ומבקש לאתחל. אם SAC כבר לא חוסם — מסיים מיד.

אפשרויות:
```powershell
.\setup-agent.ps1 -Token "..." -Provider vaidio   # ברירת מחדל: vca
.\setup-agent.ps1 -Token "..." -Sac eval          # מצב "הערכה" (לא חוסם, הפיך יותר) במקום כיבוי מלא
.\setup-agent.ps1 -Token "..." -Sac skip          # אל תיגע ב-SAC (אם כבר טופל)
```
> ⚠ `off` = כיבוי SAC חד-כיווני (אי-אפשר להדליק שוב בלי התקנת Windows מחדש) — **רק** על
> מחשב שבבעלות GVSS. `eval` עדין יותר אך Windows עלול להחליט לבדו להדליק אכיפה.
>
> בנוסף: כדי שהסוכן יעלה אוטומטית עם הדלקת המחשב במחשב חנות, ודא **התחברות אוטומטית
> (Auto-Login)** (ה-RunOnce וההפעלה רצים בכניסת המשתמש).

עזר נפרד לכיבוי SAC בלבד (בלי שאר ההתקנה): `disable-sac.bat` (Administrator).

---

## שדרוג עתידי (בתשלום) — חתימה דיגיטלית

### למה Azure Trusted Signing
התעודות של Azure Trusted Signing משורשרות ל-Microsoft Trusted Root ומקבלות **מוניטין מיידי**
ב-SmartScreen וב-SAC — בלי "תקופת חימום". זול (~$9.99/חודש), בלי טוקן חומרה. זו הבחירה
הנכונה למקרה הזה. (חלופה: תעודת **EV Authenticode** מ-DigiCert/Sectigo, ~$300+/שנה, טוקן USB.)

### הקמה חד-פעמית (Azure Trusted Signing)
1. ב-Azure Portal: צור **Trusted Signing account** + **Certificate Profile** (סוג Public Trust).
   אמת את זהות "G.V Security Solutions" (תהליך Microsoft, נמשך עד כמה ימים — חד-פעמי).
2. התקן את כלי החתימה:
   - **Windows SDK** → רכיב *"Windows SDK Signing Tools"* (נותן `signtool.exe`).
   - חבילת **Azure.CodeSigning** (dlib) — מ-NuGet `Microsoft.Trusted.Signing.Client`.
3. צור `metadata.json`:
   ```json
   {
     "Endpoint": "https://eus.codesigning.azure.net",
     "CodeSigningAccountName": "<account>",
     "CertificateProfileName": "<profile>"
   }
   ```
4. התחבר: `az login` (צריך Azure CLI עם הרשאת "Trusted Signing Certificate Profile Signer").

### בנייה + חתימה (פקודה אחת)
```powershell
cd C:\Users\gilad\Code\gv-occupancy\vaidio-agent
.\build.ps1 -Sign -Method azure -AzureDlib "C:\ats\Azure.CodeSigning.Dlib.dll" -AzureMetadata "C:\ats\metadata.json"
```
מה שקורה: בונה את `vaidio-agent.exe`, חותם, מאמת (`Get-AuthenticodeSignature` חייב `Valid`),
אורז ל-`dist\vaidio-agent-windows.zip`.

חלופות חתימה:
```powershell
.\build.ps1 -Sign -Method pfx -Pfx "C:\certs\gvss.pfx" -PfxPassword "******"   # תעודת PFX
.\build.ps1 -Sign -Method thumbprint -Thumbprint "AB12...CD34"                  # EV בטוקן USB
```

### חתימת המתקין (Inno Setup)
ה-exe המצורף נחתם ע"י `build.ps1`. את **ה-Setup עצמו** חותמים דרך Inno:
1. Inno Setup → **Tools → Configure Sign Tools** → הוסף בשם `mysign`:
   ```
   signtool.exe sign /fd SHA256 /tr http://timestamp.acs.microsoft.com /td SHA256 /dlib "C:\ats\Azure.CodeSigning.Dlib.dll" /dmdf "C:\ats\metadata.json" $f
   ```
2. בנה: `"C:\Program Files (x86)\Inno Setup 6\ISCC.exe" installer\vca-agent.iss`
   ה-`.iss` כבר מוגדר `SignTool=mysign` + `SignedUninstaller=yes` — הכל ייחתם אוטומטית.

### בדיקה שהחתימה תקפה
```powershell
(Get-AuthenticodeSignature .\vaidio-agent.exe).Status   # חייב להחזיר Valid
```
אחרי זה — הורד את ה-exe/Setup במחשב עם SAC דלוק ובדוק שלא נחסם.

---

## רקע: שחרור SAC ידני (מאחורי הקלעים של המסלול החינמי)

> ⚠ **רק** למחשב שאתה הבעלים שלו (בדיקות / קיוסק חנות). **לא** פתרון להפצה ללקוחות.
> כיבוי SAC הוא **חד-כיווני**: אי-אפשר להדליק אותו שוב בלי התקנה מחדש של Windows.

### ידני (מומלץ — שקוף):
**Windows Security → App & browser control → Smart App Control settings → Off** ואז אתחל מחשב.

### אוטומטי (admin + אתחול):
הרץ את `disable-sac.bat` (בתיקיית הסוכן) כ-Administrator. הוא מכבה SAC ברישום ומבקש אתחול.
לבדיקות בלבד אפשר גם **Evaluation mode** (לא חוסם, הפיך יותר) — ראה הערות בקובץ ה-bat.

---

## הערות
- **חתימה לא משנה את הקוד** — רק מוסיפה הוכחת-מקור. הסוכן נשאר זהה.
- לאחר שמוקם צינור החתימה, **כל בנייה עתידית** עוברת דרך `build.ps1 -Sign` ויוצאת חתומה —
  בעיית SAC נעלמת לכל הלקוחות לתמיד.
- שווה לשקול: שדרוג גם של בניית הסוכן ל-Linux כך שתעבור דרך `build.ps1` בעתיד (כרגע נבנה בנפרד).
