PDA

View Full Version : مشکل کپی فایل در ویندوز ویستا یا 7



Yasersadegh
یک شنبه 09 آبان 1389, 12:25 عصر
سلام خدمت همه دوستان و اساتید عزیز
من تویه سی یه برنامه ساده نوشتم که میاد یه فایل رو تویه system32 کپی می کنه. وقتی تو ویندوز xp اجراش می کنم مشکلی نداره و اجرا می کنه ولی وقتی تو ویندوز ویستا اجراش می کنم ارور شماره 5 یعنی ERROR_ACCESS_DENIED رو میده.
از دوستان و اساتید کسی هست که برایه حل این مشکل راه حلی داشته باشه!؟:متفکر:
من چطوری می تونم اینکار رو انجام بدم!؟:ناراحت:
ممنون میشم اگه راهنمایی بفرمایید.:قلب:

Felony
یک شنبه 09 آبان 1389, 12:50 عصر
در ویندوز ویستا و 7 سخت گیری های بیشتری رو مسائل امنیتی ویندوز در نظر گرفته شده ، برنامه شما بدون داشتن دسترسی Admin نمیتونه فایلی رو به پوشه های ویندوز کپی کنه .

حالا یا یوزر فعلی شما این دسترسی رو نداره ( Admin نیست ) یا اینکه به صورت دستی تو تنضیمات درایو ویندوز دسترسی نوشتن ازش گرفته شده .

Yasersadegh
یک شنبه 09 آبان 1389, 13:51 عصر
دوست عزیز ممنون از پاسخ و توجهتون!:قلب:
ولی خوب من چطوری می تونم این مشکل رو حل کنم!!:متفکر: البته منظورم با کد نویسی هست، نه به صورت دستی!!:متفکر:
ممنون میشم اگه دوستان راهنمایی کنند!:قلب:

Felony
یک شنبه 09 آبان 1389, 14:01 عصر
خوب شما نگفتی مشکل چی بود ؟ کاربر جاری دسترسی Admin نداشت یا دسترسیش به صورت دستی بسته شده بود یا هیچکدوم و فقط برنامتون این مشکل رو داشت ؟

r00tkit
یک شنبه 09 آبان 1389, 15:49 عصر
سلام
مشکل شما مربوط می شه به UAC



:

http://msdn.microsoft.com/en-us/library/bb756929.aspx

http://tapanpandey.wordpress.com/2009/08/30/adding-uac-elevation-manifest-in-visual-c-8-0-visual-studio-2005-c-or-c-project/

Felony
یک شنبه 09 آبان 1389, 16:54 عصر
اگر مشکل تو برنامتون هست با گرفتن Debug Privilege برای برنامتون مشکل حل میشه :

http://msdn.microsoft.com/en-us/library/aa446619(VS.85).aspx

r00tkit
یک شنبه 09 آبان 1389, 18:21 عصر
مستر تاجیک برای این کار لازم نیست token رو تغییر بدیم هون tokenنیکه UAC می ده کافی هستش! درست نمی گم ؟

شما خودتون وقتی می خواید یه چیزی رو به system32 کپی کنید درصورت on بودن UAC اول ان صفحهی معروف UAC میاد (البته اگه Privilege لازم رو نداشته باشه)

Felony
یک شنبه 09 آبان 1389, 18:43 عصر
مستر تاجیک برای این کار لازم نیست token رو تغییر بدیم هون tokenنیکه UAC می ده کافی هستش! درست نمی گم ؟

شما خودتون وقتی می خواید یه چیزی رو به system32 کپی کنید درصورت on بودن UAC اول ان صفحهی معروف UAC میاد (البته اگه Privilege لازم رو نداشته باشه)

اگر مشکل نمایش صفحه بود حرف شما درست بود ، چون فقط با روش شما میشه اون صفحه رو از پیش رو برداشت ، ولی الان مشکل اون صفحه نیست ، مشکل کپی نشدن فایل هست که با همون Debug Privilege هم مشکل حل مشه .

البته بماند که از لحاظ فنی و استاندارد حقی ندارید داخل پوشه های سیستم عامل چیزی رو کپی کنید و برای قرار دادن فایل های برنامه ها از قبیل تنضیمات و ... مایکروسافت صریحا اعلام کرده که از Program Data استفاده بشه .

r00tkit
یک شنبه 09 آبان 1389, 19:32 عصر
استاد تاجیک نمی دونم خیلی منظورم رو بد گفتم شما این جمله رو نوشتید


پس ترجیح می دم به جای توضیح دوباره شما رو ارجاع بدم به این (http://blogs.msdn.com/b/patricka/archive/2010/05/13/if-i-m-an-administrator-why-do-i-get-access-denied.aspx)

واقعا" شما برای کاری کوچکی مثل کپی به process امتیاز Debug می دین ؟؟؟؟؟:متعجب: { خیلی متعحب }

و در اخر : دوست من برنامت رو بنویس و به با خیال راحت به لینک های که دادم سر بزن یا یه run as admin برات بسه و نیازی هم نداری به برنامت امتیاز debug بدی

من نوشتم شد !!!

پی نوشت : من از امتیاز Debug برای inject کردن dll استفاده می کنم ( هر چند برنامه هایی مثل node بازم جلوی این کار رو می گیرن احتمالا" createremotethread رو هوک می کنن )

Felony
یک شنبه 09 آبان 1389, 19:44 عصر
واقعا" شما برای کاری کوچکی مثل کپی به process امتیاز Debug می دین ؟؟؟؟؟ { خیلی متعحب }
من اصولا فایلی رو تو پوشه های ویندوز کپی نمیکنم مگر Program Data ، پس نیازی به مجوز های سطح بالا و بلتبع Debug ندارم ؛ اون فقط یه راه حل بود که ارائه کردم :

مشکل کپی نشدن فایل هست که با همون Debug Privilege هم مشکل حل مشه .


پی نوشت : من از امتیاز Debug برای inject کردن dll استفاده می کنم ( هر چند برنامه هایی مثل node بازم جلوی این کار رو می گیرن احتمالا" createremotethread رو هوک می کنن )
بله همین کار رو انجام میدن .

r00tkit
یک شنبه 09 آبان 1389, 20:06 عصر
اون فقط یه راه حل بود که ارائه کردم :روش شما رو نوشتم جواب نداد

#include <windows.h>
#include<conio.h>
#include <stdio.h>
#include<iostream>

using namespace std;


/////////////////////////////////////////////////////////
// Note: Enabling SeDebugPrivilege adapted from sample
// MSDN @ http://msdn.microsoft.com/en-us/library/aa446619%28VS.85%29.aspx
// Enable SeDebugPrivilege

void sample()
{
HANDLE hToken = NULL;
TOKEN_PRIVILEGES tokenPriv;
LUID luidDebug;
if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken) != FALSE)
{
if(LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luidDebug) != FALSE)
{
tokenPriv.PrivilegeCount = 1;
tokenPriv.Privileges[0].Luid = luidDebug;
tokenPriv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if(AdjustTokenPrivileges(hToken, FALSE, &tokenPriv, 0, NULL, NULL) != FALSE)
{
// Always successful, even in the cases which lead to OpenProcess failure
cout << "SUCCESSFULLY CHANGED TOKEN PRIVILEGES" << endl;
}
else
{
std::cout << "FAILED TO CHANGE TOKEN PRIVILEGES, CODE: " << GetLastError() << endl;
}
}
}
CloseHandle(hToken);
}


int main()
{

sample();
if(CopyFile(L"d:\\q.png",L"c:\\windows\\system32\\wqqqqq.png",FALSE))

printf("ok");
else {
cout<<"erroe "<<GetLastError();
}




}



خروجی :پیغام معروف 5 یا همون
Access is denied.

Felony
یک شنبه 09 آبان 1389, 20:43 عصر
من با ++Borland C کدتون رو اجرا کردم و مشکلی نداشت و فایل کپی شد :


http://barnamenevis.org/forum/attachment.php?attachmentid=59394&stc=1&d=1287423084

با دلفی هم نوشتم مشکلی نداشت ولی فکر کنم ویندوز من مشکل داشته باشه چون 7 ماهی میشه که ویندوز رو نصبش کردم و خدا میدونه چی به سرش اومده ، احتمالا همونطور که شما تست کردی باشه و با Debug نشه فایل رو کپی کرد .

r00tkit
یک شنبه 09 آبان 1389, 21:00 عصر
نه احتمالا" مشکل اینه که شما فایل رو از داخل IDE اجرا کردین ( token از IDE به process ارث برده شده )

از windows explorer اجرا کنید

------
چقدر کشدین ER سخته فردا باید به استادمون پروژه تحویل بدم گیر کردم توش ، به هرکی نشون می دی یه نظری می دی :گریه:

Felony
یک شنبه 09 آبان 1389, 21:11 عصر
نه احتمالا" مشکل اینه که شما فایل رو از داخل IDE اجرا کردین ( token از IDE به process ارث برده شده )

از windows explorer اجرا کنید

------
چقدر کشدین ER سخته فردا باید به استادمون پروژه تحویل بدم گیر کردم توش ، به هرکی نشون می دی یه نظری می دی :گریه:

:چشمک: اخوی اینا رو میدونیم ... ، هم برنامه نوشته شده با ++Borland C و هم برنامه نوشته شده با دلفی هر دو درست کار میکنن، مشکل از دسترسی های ویندوز هست ، چند وقت پیش داشتم با همون Manifest ها تو برنامم ور میرفتم برای یکسری تست تنظیماتی رو تغییر دادم و برگردوندم ولی مثل اینکه کلا زده به سیم آخر ...

تو ماشین مجازی تست کردم کپی نشد ، پس نتیجه میگیرم با Debug نمیشه مجوز دسترسی برای کپی رو گرفت الان هم که به مستنداتش مراجعه کردم دیدم که توضیحات داده شده که فقط برای کار تو پروسه ها ازش استفاده میشه ، خلاصه این ویندوز من رو به اشتباه انداخت و با تست هایی که کردم فکر کردم این کار شدنیه ولی نیست ! ( نتیجه : به چشمات هم اطمینان نکن ! )

Yasersadegh
دوشنبه 10 آبان 1389, 10:34 صبح
دوستان خیلی خیلی ممنونم از راهنمایی هاتون!!:قلب:


سلام
مشکل شما مربوط می شه به UAC



:

http://msdn.microsoft.com/en-us/library/bb756929.aspx

http://tapanpandey.wordpress.com/200...-or-c-project/ (http://tapanpandey.wordpress.com/2009/08/30/adding-uac-elevation-manifest-in-visual-c-8-0-visual-studio-2005-c-or-c-project/)

من از این لینکها استفاده کردم و یه فایل manifest درست کردم و به برنامم چسبوندم! برنامه اجرا میشه و یه صفحه با عنوان User Control Account تو ویندوز ویستا باز میشه که اگه Allow بدم بفایل کپی میشه! در صورتی که قبلا اصلا اجازه نمی داد و این پیغام رو هم نمی داد.! یعنی الان یه قدم جلو رفتم و از شما ممنونم به خاطر کمکتون!!:لبخندساده:
ولی ...
حالا راهی هست که بدون اینکه اون صفحه User Control Account رو نشون بده فایل رو کپی کنه!!؟:متفکر:
ممنون میشم اگه تو این مرحله هم کمکم کنید!!!:چشمک:

r00tkit
دوشنبه 10 آبان 1389, 10:41 صبح
این یه ویژگی در ویندوز هستش نه یه باگ و چیز بد

توصیه می کنم گفتگوی من با اقای تاجیک رو به همراه لینک هایی که دادم روبخونید تا علت وجود UAC رو بدونید

لازم نیست کاری کنید همون صفحه بزارید بیاد که برای همهی برنامه ها همین جوریه

اما اگه می خواین دیگه نیاد تو سرچ start بنویسید UAC بعد از کارش بندازیدش بعد از این همهی برنامه ها سطح ادمین می شن