Freigeben über

batch signieren von Excel makros

Anonym
2024-04-19T10:37:50+00:00

Wir möchten gerne nur noch das ausführen signierter Excelmakros erlauben. Jedoch haben wir mehrere tausend alte Excel Dokumente mit insgesamt 40 verschiedenen Makros. (PDM/PLM)
Da die Makros teilweise über 20 Jahre alt sind und nie Probleme bereitet haben möchten wir ihnen eine pauschale Signatur hinterlegen. Alle neueren Makros müssen zukünftig von der IT bewilligt und freigegeben werden. Für diese alten Exceldokumente möchten wir ein SelfSignetCertificate verwenden.

Können wir per batch script alle alten Excel Dokumente signieren lassen?

Microsoft 365 und Office | Excel | Geschäftlich | Windows

Gesperrte Frage. Diese Frage wurde aus der Microsoft-Support-Community migriert. Sie können darüber abstimmen, ob sie hilfreich ist, aber Sie können keine Kommentare oder Antworten hinzufügen oder der Frage folgen.

0 Kommentare Keine Kommentare
{count} Stimmen

6 Antworten

Sortieren nach: Am hilfreichsten
  1. Anonym
    2024-06-05T10:00:19+00:00

    Gerne. Man muss eigentlich nur der Anleitung von Digicert folgen. Zugegeben die ist etwas schwer zu verstehen.

    "Microsoft Office Subject Interface Packages for Digitally Signing VBA Projects" herunterladen :
    https://www.microsoft.com/en-us/download/details.aspx?id=56617
    Das tool tut grossspurig als wäre es ein Installer. Es entpackt aber nur. Anschliessend müssen zwei DLL registriert werden:

    regsvr32.exe <complete path to msosip.dll> regsvr32.exe <complete path to msosipx.dll>

    Microsoft SDK herunterladen: https://developer.microsoft.com/en-us/windows/downloads/windows-sdk/ und die x86 von sign tool in PATH hinterlegen: C:\Program Files (x86)\Windows Kits\10\bin\10.0.26100.0\x86

    Hab unser Script verschlankt und nicht nach getestet.
    Die Passwortlösung ist deaktiviert, da wir das für die Tests über usernamen anbinden wollen. Wenn mir wer sagen kann, wie es funktioniert, das das Zertifikat über den usernamen abgesichert wird. würde ich mich freuen.

    Zertifikat erzeugen :

    # Variablen
    $gultigkeit =  #Gültigkeit in monaten der CA innerhalb dessen es zum signieren benutzt werden darf
    $KeyFriendlyName =  #Präfix für den RootKey mit Zertifikatstyp und trenner für das Datum
    $FriendlyName =  #Präfix für den RootCA mit Zertifikatstyp und trenner für das Datum
    $certFilePath = "C:\temp\" # Pfad zum ClientZertifikat
    
    $Certificate = @{
    DnsName = example.com # Um Ein SAN Zertifikat auszustellen. Kommasepariert können auch subdomains wie xx.example.com hinterlegt weren
    Type = "CodeSigningCert"
    Subject = "CN=example.com,O=Example AG" # Name des Antragsstellers
    NotAfter = (Get-Date).AddMonths($gultigkeit)
    FriendlyName = "$FriendlyName$((Get-Date).AddMonths($gultigkeit).ToString('yyyyMMdd'))"
    KeyDescription = "Private key for Example Company CA" #
    KeyFriendlyName = "$KeyFriendlyName$((Get-Date).AddMonths($gultigkeit).ToString('yyyyMMdd'))"
    CertStoreLocation = "Cert:\LocalMachine\My"
    # KeyUsage =  # Beispiele: "None","EncipherOnly","CRLSign","CertSign","KeyAgreement","DataEncipherment","KeyEncipherment","NonRepudiation","DigitalSignature","DecipherOnly"
    }
     
    # Erstellen eines neuen selbstsignierten Zertifikats
    $cert = New-SelfSignedCertificate @Certificate
    $thumbprint = $cert.Thumbprint
    
    #Add-Type -AssemblyName System.Web
    #Add-Type -AssemblyName Microsoft.VisualBasic
    #$Zeichen = 12; $Sonderzeichen = 2
    #$Password = [System.Web.Security.Membership]::GeneratePassword($Zeichen,$Sonderzeichen)
    #$Password = [Microsoft.VisualBasic.Interaction]::InputBox("Das Passwort wurde automatisch mit $Zeichen Zeichen und $Sonderzeichen Sonderzeichen #generiert. Bitte ändern bei Bedarf.", "Generiertes Passwort", $Password)
    #$SecurePassword = ConvertTo-SecureString -String $Password -AsPlainText -Force
    #$cred = New-Object System.Management.Automation.PSCredential ("USERNAME", $SecurePassword)
    
    $exportPFX =@{
    ProtectTo  = 'Administrator' #User die auf den Schlüssel  zugreifen dürfen 
    FilePath = "$certFilePath$dnsName$($cert.NotAfter.ToString('yyyyMMdd')).pfx"
    #Password = $cred.Password
    }
     
    # Exportieren des Zertifikats in eine .cer-Datei
    Export-Certificate -Cert $cert -FilePath "$($certFilePath)ClientCertificate-$($thumbprint).cer"
    # Exportieren (Backup) in ein PFX
    Export-PfxCertificate @exportPFX
    

    Beispiel einzelnes Dokument Signieren

    # DOC: https://learn.microsoft.com/en-us/dotnet/framework/tools/signtool-exe
    
    $xlsxTest = 'c:\tmp\Test.xlsm' #Test Datei zum signieren. 
    $TSA = 'http://timestamp.digicert.com' 
    $sig = 'xxxxxxxxxxxxxxxxx' #thumbprint des scriptes  
    & 'signtool.exe' sign /debug /sha1 $sig /tr $TSA /td SHA256 /fd SHA256 /sm $xlsxTest
    

    Ist bei uns gerade in der Testphase. Da ich zum ersten mal was mit Powershell gemacht habe, wird da noch jemand drüber schauen der sich besser auskennt. Falls jemand von euch Verbesserungsvorschläge hat, nehme ich sie dankend an.

    0 Kommentare Keine Kommentare