Question Utiliser CryptProtectData avec PowerShell (Résolu)

Plus d'informations
il y a 15 ans 10 mois #2402 par daniel soares
Bonjour

les fichiers rdp pour le bureau a distance entre autre utilisent pour crypter le mot de passe la fonction cryptprotectdata

www.obviex.com/samples/dpapi.aspx
msdn.microsoft.com/en-us/library/aa380261.aspx

je souhaiterai pouvoir utiliser cette fonction sur powershell pour creer des fichiers rdp mais il semble que l'api ne permette pas l'utilisation sur powershell
qu'elle soit utilisable seulement avec des languages compilés
je n'y connais rien n'etant pas developpeur

ma question est double

microsoft et d'autres sites fournissent des codes pour utiliser cette fonction avec entre autre C#
existe t'il une version free de C# qui me permette de tester ce code.

et plus en rapport avec ce site :)
est il simple de creer des cmdlets powershell en C# qui pourraient donc utiliser cette fonction?<br><br>Message édité par: Arnaud, à: 23/06/08 13:29

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 10 mois #2403 par Laurent Dardenne
Salut,
Dan écrit:

mais il semble que l'api ne permette pas l'utilisation sur powershell qu'elle soit utilisable seulement avec des languages compilés

C'est une API win32, du code natif,et PS utilise du code managé au travers de .NET. Donc pas de manipulation de mémoire via des pointeurs. Dans ce cas il faut utiliser le mécanisme appelé P/Invoke.
Dan écrit:

est il simple de creer des cmdlets powershell en C# qui pourraient donc utiliser cette fonction?

Tu peux le faire sous PS, un exemple de P/Invoke, c'est un peu tordu mais c'est une solution :
www.leeholmes.com/blog/ManagingINIFilesWithPowerShell.aspx

Attention aux paramètres out de ces API:
[code:1]__out DATA_BLOB* pDataOut[/code:1]
car c'est au développeur de libérer la mémoire.
voir aussi :
pinvoke.net/default.aspx/crypt32/CryptProtectData.html

La v2 apporte des améliorations de ce coté là :
blogs.msdn.com/powershell/archive/2008/0...v2-custom-enums.aspx
et
blogs.msdn.com/powershell/archive/2008/0...hide-powershell.aspx

Pour info toutes les API windows n'ont pas été portées sous .NET ou elles le sont au fur et à mesure des versions.

ps
Tu peux aussi utiliser CodeDOM pour mixer à la volée du code C# et PS. Enfin, regarde dans le projet PSCX (codeplex) s'il propose qq chose sur le sujet.<br><br>Message édité par: Laurent Dardenne, à: 10/06/08 12:06

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 10 mois #2405 par daniel soares
Merci Laurent pour toutes ces voies d'exploration
c'est du chinois pour l'instant mais je vais m'en imprégner et voir ce que je peux en sortir
je n'hésiterai pas a te solliciter en cas d'impasse :)

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 10 mois #2406 par Laurent Dardenne
Dan écrit:

c'est du chinois pour l'instant mais je vais m'en imprégner et voir ce que je peux en sortir

Je crois qu'il y a une approche plus simple étant donné que le premier lien cité propose du code CSharp. Code que je n'avais pas vu...
[code:1]
#http://www.obviex.com/samples/dpapi.aspx
# 1 recopier le code C# présent sur la page précédente dans un fichier nommé DPAPI.cs
# 2 compiler le fichier Csharp : ps&gt; csc /t:library DPAPI.cs

#Todo
# trap
# { $Exception=$_
# while $Exception -ne $null
# { Write-Host $_.Message
# $Exception= $Exception.InnerException
# }
# }

#Charge la DLL Data Protection API
$DLLpath =$pwd
$Fullpath =\&quot;$DLLpath\DPAPI.dll\&quot;
[void][Reflection.Assembly]::LoadFile($Fullpath)

$text=\&quot;Hello, world!\&quot;
$entropy=$null
$description=\&quot;\&quot;
Write-Host (\&quot;Plaintext: {0}`r`n\&quot; -f $text)

# Call DPAPI to encrypt data with user-specific key.
$encrypted=[DPAPI]::Encrypt([DPAPI+KeyType]::UserKey,$text,$entropy,\&quot;My Data\&quot;«»)
Write-Host (\&quot;Encrypted: {0}`r`n\&quot; -f $encrypted)

# Call DPAPI to decrypt data.
$decrypted = [DPAPI]:: Decrypt($encrypted,$entropy,[REF] $description)
Write-Host (\&quot;Decrypted: {0} &lt;&lt;&lt;{1}&gt;&gt;&gt;`r`n\&quot; -f ($decrypted, $description))
[/code:1]

Pour info [REF] gére les paramètres références utilisés par .NET.

Et l'usage du signe + dans la syntaxe suivante :
[code:1]
[DPAPI+KeyType]::UserKey
[/code:1]
permet d'accéder à un type imbriqué dans la classe DPAPI.
Je te laisse terminer le bloc de gestion des exceptions :P

Edit
Le fichier ne contient pas d'espace de nom et toutes les méthodes de la classe DPAPI sont statiques, pas besoin de créer une instance (un objet).

Message édité par: Laurent Dardenne, à: 10/06/08 15:16<br><br>Message édité par: Laurent Dardenne, à: 16/06/08 14:54

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 10 mois #2414 par daniel soares
merci laurent
la solution fonctionne
ca crypte et ca decrypte
par contre le resultat du cryptage n'a rien a voir avec celui de mon fichier rdp :)
je me suis ptet planté sur les ambitions de la solution
je continue a investiguer

par contre une question sur la dll generee par csc.exe
j'ai plusieurs csc. au moins un par framework: 1, 2 et 3.5
il y a t'il une difference a utiliser l'un ou l'autre?

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 15 ans 10 mois #2416 par Laurent Dardenne
Dan écrit:

je me suis ptet planté sur les ambitions de la solution

Du peu que j'ai regardé sur le sujet l'approche me semblait correct.
Si tu compares un fichier crypté je ne suis pas certain que le résultat d'une opération de cryptage soit tjr le même (je n'ai pas testé)
Dan écrit:

il y a t'il une difference a utiliser l'un ou l'autre?

Outre la gestion des nouveautés du langage de chaque version de C#, il doit y avoir une différence dans les métadonnées mais là je n'ai pas creusé le sujet. De tout façon, si me souviens bien, tu peux avoir une version de la même dll compilée dans les 3 versions,
l'exécution \&quot;côte à côte\&quot; permet cela. Les ressources nécessaire n'étant bien évidemment plus les mêmes.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.080 secondes
Propulsé par Kunena