Kullanıcı Hesap Kontrolü (User Account Control)

Yazdığınız makaleleri ve üyelerimizin işine yarayacağını düşündüğünüz kodlarınızı gönderebilirsiniz. Bu foruma soru sormayın!
Cevapla
RamazanG
Üye
Mesajlar: 73
Kayıt: 16 Tem 2010 03:38

Kullanıcı Hesap Kontrolü (User Account Control)

Mesaj gönderen RamazanG »

Merhaba Arakadaşlar kendim çevirdim inşallah birilerine yardımı olur.

Windows Güvenliği ve Kullanıcı Hesabı Kontrolü.
Windows Vista, uygulamaların dosya sistemini kullanmasına kısıtlamalar getirir. Önceki işletim sisteminde kullanıcıların Doküman klasörleri altında değişiklik yapmaları tartışma konusu oldu. Kullanıcılara çoğu güvenlik sistemi kapatıldı, ancak varsayılan olarak çalışabildiler. Uygulamalar Vista altında çalışırken güvenlik özelliklerini değiştirmeden çalışabilirler, güvenlik özelliklerini değiştirmelerine izin yoktur.

Windows Kaynak Koruması (WRP).
Windows kaynak koruması (WRP) herhangi bir değişikliğe karşı sistem dosyalarını, klasörlerini ve Registry uygulamasını sadece okunur yaparak korur. Yani bu dosya, klasör ve Registry de hiçbir değişiklik yapamazsınız. WRP da değişiklik yapmayınca hiçbir uygulamanın Yönetici gibi çalışmasına izin vermez ama çalışan programların registry bilgilerini okumalarına izin verir. WRP sadece Windows modullerinin tam bir Yönetici olarak çalışmasına izin verir. Bunun nedeni registry key kontrolu yapmak istemesidir. Bazı özel API leri kullanabilirsin ancak çok azı bunu yapmana izin verir.
Geçmişte Root altına kayıt yapmak pratik ve çok kolay bir yöntemdi yada program files klasörü altına bir dosya kaydetmek çok kolaydı. Bütün bu olanları denemek için “File Access” uygulamasını yazdım bir program, dosyayı farklı klasörlere kaydediyor (ve farklı klasörlerden yükleme yapıyor). Dosyayı “C:Drive” altına kaydediyor. Bunun nedeni aşağıdaki beklenti.

Exception class EFCreateError with message ‘Cannot create file “C:\SomeText.txt” . Kayıt işlemi başarısız.’ Uygulama FileAccess.exe (5492)

Diğer bir seçenek dosyayı programla aynı klasöre kaydetmek.

Procedure TFormFile.btnSaveLocakClick(Sender: TObject);
Begin Memo1.Lines.Savetofile(ExtractFilePath(Application.ExeName)+’SomeText.txt’);
End;

Bu kod dosya sisteminde hesap kaydından bağımsız çalışır gibi çalıştı ancak program files klasörüne baktığım zaman sanal bir hafızaya depolanmış olduğunu gördüm.
Bu uygulamanın doğru bir şekilde davranması için ne yapılabilir. Aşağıdaki kodu uygulamanın doğru kullanıcı gibi davranması ve belgenin kaydedilebilmesi için yazdım. SHFolder Unit’i altında SHFolderPath API sini kullandım.

Uses
SHFolder;
Const
TOKEN_DEFAULTUSER = $FFFF; // -1
Procedure TFormFile.btnSaveDocsClick(Sender: TObject);
Var
szBuffer: String;
Begin
SetLength(szBuffer,250);
SHGetFolderPath(Handle, CSIDL_PERSONAL, TOKEN_DEFAULTUSER, 0, PChar(szBuffer));
szBuffer:= PChar(szBuffer);
Memo1.Lines.SavetoFile(szBuffer + ‘\SomeText.txt’);
End;
Bu uygulama benim Vista uygulamamda dosyayı aşağıdaki satıra kaydetti.

“C:\User\DELPHI\Documents\SomeText.txt”

Sanal Depolama
Vista da sadece “C:\Windows” altında değil bazı özel klasörlerle de işlem yapamazsın “C:\programFiles” gibi. Eğer bu klasörler içine bir dosya kopyalayıp root altına kaydetmek istiyorsan uygulama başarısızlıkla sonuçlanacaktır. Kaydetmek istediğin uygulama sanal bir hafıza ya gönderilecek ve orda depolonacaktır, yani
“C:\ ProgramFiles\FileAccess”
E Kaydetmek istediğin zaman, buraya kaydedecektir.

“C:\Users\DELPHI\AppData\Local\VirtualStore\ProgramFiles\FileAccess”

İyi tarafı Vista gelecekte bu uygulamadan vazgeçecek.

Kullanıcı Hesap Kontrolü (User Access Control)

Sistem uygulamadan özel bir izin soracak. Vista dan programı korumak için bir şeyler yapmalısın. Geçmişte böyle bir işleme gerek yoktu sadece root altına programı kaydediyordun.
Gelişim

Yukarıdaki uygulama çalıştırılabilir bir yönetici iznine ihtiyaç duyduğu zaman, özel bir güvenlik ve yönetici izni oluşturmalısın. İlk alanda radikal bir değişiklik yaparak programı doğru yönetici olarak başlatmalısın. Öyleyse FileAccess programını C:drive altına kaydetmek için ne yapmalısın? basit bir konsol uygulaması yazmak için çaba sarf et(sadece iyi bir Windows programı olabilecek) . Bunun sonucu olarak program bir dosya ya diğer dosyanın içeriğini kopyalar.

Kodun tamamı aşağıda.

Program FileAccessCopy;
{$APPTYPE CONSOLE}
Uses
sysUtils, Classes;
var
strIn, strOut: TFileStream;
begin
try
if ParamCount <>2 then
Writeln(‘2 parametre gerekli’);
Exit;
End;
Writeln(‘reading…’ + ParamStr(1));
strIn:= TFileStream.Create(ParamStr(1), fmOpenRead);
try
writeln(‘Writing….’+ ParamStr(2));
if fileExist(ParamStr(2)) then
strOut:= TFileStream.Create(ParamStr(2), fmOpenWrite)
else
strOut:= TFileStream.Create(ParamStr(2), fmOpenWrite);
try
strOut.CopyFrom(strIn,strIn.Size);
finally
strOut.Free;
end;
strIn.Free;
end;
writeln(‘İşlem tamamlandı çıkmak için kapa düğmesine tıklayın’);
except
on E: exception do
Writeln(E.ClassName,’:’, E.Message);
End;
Readln;
End.

Şimdi bu programı bir yönetici gibi nasıl çalıştıracağız? Bunun için bir ShellExecute API kullanacağız. Kodlar aşağıda:

Uses
SHellApi;

procedure TfrmMain.RunAsAdmin(hWnd: HWND; aFile, aParameters: String);
var
sei:TShellExecuteInfoA;
begin
FillChar(sei, Sizeof(sei),0);
sei.cbSize:= Sizeof(sei);
sei.Wnd:= hWnd;
sei.fMask:= SEE_MASK_FLAG_DDEWAIT or SEE_MASK_FLAG_NO_UI;
sei.lpVerb:='runas';
sei.lpFile:=PAnsiChar(aFile);
sei.lpParameters:= PAnsiChar(aParameters);
sei.nShow:= SW_NORMAL;
if not ShellExecuteEx(@sei) then
RaiseLastOSError;

end;

FileAccess örneği yardımcı program ve işlem yapılacak iki dosyanın adını içerir.
Procedure TFormFile.btnUACClick(Sender: TObject);
Var
StrParams: String;
Begin
StrParams:= ‘SomeText.txt’ ‘C:\SomeText.txt’;
RunAsAdmin(Handle, ‘FileAccess’,StrParams);
End;
Cevapla