Super User — запуск программ из командной строки с правами администратора

Board index phpBBex 1.x Мастерская

Description: Только готовые решения! Статьи, заметки, моды и другие полезности для phpBBex 1.x и phpBB 3.0.x.
Moderator: Поддержка

Post #1by VEG » 22.03.2013, 18:25

Если вы активный пользователь командной строки под Windows, вам определённо пригодится крохотная утилита su (Super User), которая позволяет запускать программы с повышенными привилегиями без необходимости ввода пароля администратора (но с появлением диалога UAC). По сути это аналог функции Run as administrator из контекстного меню, но с одним важным различием: стандартный механизм устанавливает рабочий каталог c:\windows\system32\, а su сохраняет тот каталог, из которого он был запущен. То есть стандартными средствами нельзя запустить, например, сmd в том каталоге, который у вас сейчас открыт в Total Commander, что очень неудобно. А в su этот вопрос полностью решён.

Для работы необходимо предварительно скопировать файл программы в системную директорию c:\windows\system32\, после чего утилита всегда будет готова к работе в консоли или по нажатию Win+R.

Для того, чтобы запустить командную строку в текущем каталоге, например, при помощи Total Commander, необходимо просто ввести команду su в соответствующее поле внизу экрана, нажать Enter и согласиться с выдачей приложению повышенных привилегий (Alt+Y).

Для запуска любых сторонних команд с повышенными привилегиями необходимо указать их непосредственно после команды su. Например, если вы находитесь в каталоге c:\windows\system32\drivers\etc\ и хотите открыть файл hosts в блокноте, просто выполните команду:
Code: Select all
su notepad hosts

Также не стоит забывать о быстром запуске командной строки при помощи диалога «Выполнить» (Win+R). При этом командный интерпретатор будет запущен в каталоге пользователя, а не в системном каталоге.

Скачать:
su-v1.2.0.zip
Super User v1.2.0 [19.02.2013]
(5.16 KiB) Downloaded 1751 times
(5KiB).
С наилучшими пожеланиями, Евгений
VEG M
Topic author, Администратор
Avatar
Age: 30
Location: Минск, Беларусь
Reputation: 1574
With us: 5 years 7 months

Post #2by dark » 01.05.2013, 11:17

Эта утилита позволяет наследовать права?
У меня есть код на cmd, которые исполняется из vbs, так вот в Win 7, при запуске vbs от имени администратора, vbs исполняется с этими правами, далее из него вызывается cmd скрипт без показа консоли, cmd будет работать с теми же правами как и vbs?
dark
Новичок
Reputation: 0
With us: 4 yaers 10 months

Post #3by VEG » 01.05.2013, 12:14

dark wrote:У меня есть код на cmd, которые исполняется из vbs, так вот в Win 7, при запуске vbs от имени администратора, vbs исполняется с этими правами, далее из него вызывается cmd скрипт без показа консоли, cmd будет работать с теми же правами как и vbs?
Должно сохранять права. Главное основной скрипт запускать через su. Если же вдруг окажется, что vbs по каким-то причинам запускает cmd с обычными правами, вы можете тогда прописать запуск «su cmd» вместо просто «cmd».
С наилучшими пожеланиями, Евгений
VEG M
Topic author, Администратор
Avatar
Age: 30
Location: Минск, Беларусь
Reputation: 1574
With us: 5 years 7 months

Post #4by dark » 01.05.2013, 13:13

Скрипты запускаются еще до входа пользователя и в скрытом режиме, поэтому там нет возможности поэтапно проверить наследование прав, только по результатам. Прямой вызов скрипта из другого скрипт до логина выполнялся через раз, иногда cmd требовал подтвердить наследование прав вводом пароля пользователя, консоль скрыта и вывод запрещен, следственно в логах было отказано в доступе, с этим вроде работает все как надо.
Можете поделится сорцами? Мой декомпилятор выкинул достаточно странноватый код, в нем нет поддержки последних двух стандартов C++.
Code: Select all
L00401000(
    _unknown_ __eax,                       // r0
    _unknown_ __ebx,                       // r1
    _unknown_ __ecx,                       // r2
    _unknown_ __edx                        // r3
)
{
    signed short* _v8;                     // _cfa_fffffff8
    signed short* _v12;                    // _cfa_fffffff4
    char _v16;                             // _cfa_fffffff0
    char _v20;                             // _cfa_ffffffec
    char _v24;                             // _cfa_ffffffe8
    intOrPtr _v28;                         // _cfa_ffffffe4
    intOrPtr _v32;                         // _cfa_ffffffe0
    intOrPtr _v36;                         // _cfa_ffffffdc
    char _v40;                             // _cfa_ffffffd8
    intOrPtr _v72;                         // _cfa_ffffffb8
    intOrPtr _v80;                         // _cfa_ffffffb0
    char* _v84;                            // _cfa_ffffffac
    intOrPtr _v88;                         // _cfa_ffffffa8
    signed short* _v96;                    // _cfa_ffffffa0
    char _v100;                            // _cfa_ffffff9c
    char _v108;                            // _cfa_ffffff94
    char _v628;                            // _cfa_fffffd8c
    char _v8816;                           // _cfa_ffffdd90
    char _v8820;                           // _cfa_ffffdd8c
    _unknown_ __edi;                       // r4
    _unknown_ __esi;                       // r5
    _unknown_ __ebp;                       // r6
    signed short* _t53;                    // _t53
    signed int _t54;                       // _t54
    char* _t55;                            // _t55
    char* _t59;                            // _t59
    signed int _t61;                       // _t61
    intOrPtr* _t62;                        // _t62
    signed int* _t63;                      // _t63
    intOrPtr _t65;                         // _t65
    signed int _t69;                       // _t69
    signed int _t76;                       // _t76
    char* _t79;                            // _t79
    signed short* _t87;                    // _t87
    _unknown_ _t90;                        // _t90
    _unknown_ _t91;                        // _t91
    intOrPtr* _t92;                        // _t92
    _unknown_ _t93;                        // _t93
    _unknown_ _t94;                        // _t94
    signed short* _t95;                    // _t95
    _unknown_ _t96;                        // _t96
    _unknown_ _t97;                        // _t97

    __ebx = __ebx;
    _push(__ecx);
    _push(_t93);
    __imp__GetLastError();
    _push(0);
    _push(0);
    _t94 = __eax;
    _push( &_v8);
    _push(1024);
    _push(_t94);
    _push(0);
    _push(4864);
    _v8 = 0;
    __imp__FormatMessageW();
    _t53 = _v8;
    _push(16);
    _push(4202700);
    if(_t53 == 0) {
        _push(4202708);
        __imp__GetForegroundWindow();
        _push(_t53);
        __imp__MessageBoxW();
    } else {
        _push(_t53);
        __imp__GetForegroundWindow();
        _push(_t53);
        __imp__MessageBoxW();
        _push(_v8);
        __imp__LocalFree();
    }
    _push(_t94);
    __imp__ExitProcess();
    asm("int3 ");
    asm("int3 ");
    asm("int3 ");
    asm("int3 ");
    asm("int3 ");
    asm("int3 ");
    asm("int3 ");
    asm("int3 ");
    asm("int3 ");
    asm("int3 ");
    asm("int3 ");
    asm("int3 ");
    asm("int3 ");
    asm("int3 ");
    asm("int3 ");
    asm("int3 ");
    _push(_t96);
    _t97 = __esp;
    __esp = __esp - 8812;
    _push(_t94);
    _push(_t91);
    __imp__GetCommandLineW();
    _t95 = _t53;
    _t54 =  *_t95 & 65535;
    _t71 = 0;
    if(_t54 == 0) {
L11:
        if( *_t95 == 32) {
            goto L12;
        }
    } else {
        _t71 = _t71;
L6:
L6:
        if(_t54 == 34) {
            _t71 = _t71 == 0;
        }
        if(_t71 != 0 || _t54 != 32) {
            goto L10;
        } else {
            goto L12;
        }
        do {
L12:
            _t95 =  &(_t95[1]);
        } while( *_t95 == 32);
        goto L13;
L10:
        _t54 = (_t95[1]) & 65535;
        _t95 =  &(_t95[1]);
        if(_t54 != 0) {
            goto L6;
        } else {
            goto L11;
        }
    }
L13:
    if( *_t95 != 64) {
    } else {
        _t69 = (_t95[1]) & 65535;
        _t95 =  &(_t95[1]);
        _t90 = 0;
        _t79 =  &_v628;
        if(_t69 == 0) {
        } else {
            __ebx = __ebx;
L16:
L16:
            if(_t69 == 34) {
                _t90 = _t90 == 0;
            }
            if(_t90 != 0 || _t69 != 32) {
                goto L20;
            }
            goto L23;
L20:
            if(_t69 != 34) {
                 *_t79 = _t69;
                _t79 =  &(_t79[2]);
            }
            _t69 = (_t95[1]) & 65535;
            _t95 =  &(_t95[1]);
            if(_t69 != 0) {
                goto L16;
            }
        }
L23:
        _t54 = 0;
         *_t79 = 0;
        if( *_t95 != 32) {
        } else {
            do {
                _t95 =  &(_t95[1]);
            } while( *_t95 == 32);
        }
        _t71 =  &_v628;
        _push( &_v628);
        __imp__SetCurrentDirectoryW();
        if(_t54 == 0) {
            _t54 = L00401000(_t54, __ebx, _t71, _t90);
        }
    }
    _t82 =  &_v12;
    _push( &_v12);
    _push(8);
    _v12 = 0;
    _v24 = 0;
    __imp__GetCurrentProcess();
    _push(_t54);
    __imp__OpenProcessToken();
    if(_t54 == 0) {
        L00401000(_t54, __ebx, _t71, _t82);
    }
    _t83 = _v12;
    _t55 =  &_v24;
    _push(_t55);
    _push(4);
    _t72 =  &_v16;
    _push( &_v16);
    _push(20);
    _push(_v12);
    __imp__GetTokenInformation();
    if(_t55 == 0) {
        L00401000(_t55, __ebx, _t72, _t83);
    }
    _t92 = __imp__CloseHandle;
    _push(_v12);
     *_t92();
    if(_v16 != 0) {
        _push(68);
        _push(0);
        _push( &_v108);
        memset();
        _t73 =  *4202752;
        _v40 = 0;
        _v36 = 0;
        _v32 = 0;
        _v28 = 0;
        __esp = __esp + 12;
        _v108 = 68;
        _v20 =  *4202748;
        _v16 =  *4202752;
        if( *_t95 == 0) {
            _t95 =  &_v20;
        }
        _t85 =  &_v40;
        _push( &_v40);
        _t59 =  &_v108;
        _push(_t59);
        _push(0);
        _push(0);
        _push(0);
        _push(0);
        _push(0);
        _push(0);
        _push(_t95);
        _push(0);
        _v96 = _t95;
        __imp__CreateProcessW();
        if(_t59 == 0) {
            L00401000(_t59, __ebx, _t73, _t85);
        }
        _push(_v40);
         *_t92();
        _push(_v36);
         *_t92();
        goto L45;
    } else {
        _push(8188);
        _t61 =  &_v8816;
        _push(0);
        _push(_t61);
        _v8820 = 2228288;
        memset();
        __esp = __esp + 12;
        _push( &_v8816);
        _push(260);
        __imp__GetCurrentDirectoryW();
        _t62 = _t97 + -8808 + _t61 * 2;
         *_t62 = 2097186;
        _t76 =  *_t95 & 65535;
        _t63 = _t62 + 4;
        _t87 = _t95;
        if(_t76 == 0) {
        } else {
            __ebx = __ebx;
            do {
                _t87 =  &(_t87[1]);
                 *_t63 = _t76;
                _t76 =  *_t87 & 65535;
                _t63 =  &(_t63[0]);
            } while(_t76 != 0);
        }
        _push(60);
         *_t63 = 0;
        _push(0);
        _push( &_v100);
        memset();
        __esp = __esp + 12;
        _push(260);
        _push( &_v628);
        _push(0);
        _v100 = 60;
        _v72 = 1;
        __imp__GetModuleFileNameW();
        _t78 =  &_v100;
        _t89 =  &_v628;
        _t65 =  &_v8820;
        _push( &_v100);
        _v84 =  &_v628;
        _v88 = 4202736;
        _v80 = _t65;
        __imp__ShellExecuteExW();
        if(_t65 != 0) {
L45:
            _pop(__edi);
            _pop(__esi);
            return;
        } else {
            __imp__GetLastError();
            if(_t65 != 1223) {
                L00401000(_t65, __ebx, _t78, _t89);
            }
            _pop(__edi);
            _pop(__esi);
            return;
        }
    }
}

L00401080(
    signed short* __eax,                   // r0
    _unknown_ __ebx,                       // r1
    _unknown_ __ecx,                       // r2
    _unknown_ __edx                        // r3
)
{
    char _v8;                              // _cfa_fffffff8
    char _v12;                             // _cfa_fffffff4
    char _v16;                             // _cfa_fffffff0
    char _v20;                             // _cfa_ffffffec
    intOrPtr _v24;                         // _cfa_ffffffe8
    intOrPtr _v28;                         // _cfa_ffffffe4
    intOrPtr _v32;                         // _cfa_ffffffe0
    char _v36;                             // _cfa_ffffffdc
    intOrPtr _v68;                         // _cfa_ffffffbc
    intOrPtr _v76;                         // _cfa_ffffffb4
    char* _v80;                            // _cfa_ffffffb0
    intOrPtr _v84;                         // _cfa_ffffffac
    signed short* _v92;                    // _cfa_ffffffa4
    char _v96;                             // _cfa_ffffffa0
    char _v104;                            // _cfa_ffffff98
    char _v624;                            // _cfa_fffffd90
    char _v8812;                           // _cfa_ffffdd94
    char _v8816;                           // _cfa_ffffdd90
    _unknown_ __edi;                       // r4
    signed short* __esi;                   // r5
    _unknown_ __ebp;                       // r6
    signed int _t48;                       // _t48
    char* _t49;                            // _t49
    char* _t53;                            // _t53
    signed int _t55;                       // _t55
    intOrPtr* _t56;                        // _t56
    signed int* _t57;                      // _t57
    intOrPtr _t59;                         // _t59
    signed int _t63;                       // _t63
    signed int _t70;                       // _t70
    char* _t73;                            // _t73
    signed short* _t80;                    // _t80
    _unknown_ _t83;                        // _t83
    _unknown_ _t84;                        // _t84
    intOrPtr* _t85;                        // _t85

    __ebx = __ebx;
    _push(_t84);
    __imp__GetCommandLineW();
    __esi = __eax;
    _t48 =  *__esi & 65535;
    _t65 = 0;
    if(_t48 == 0) {
L7:
        if( *__esi == 32) {
            goto L8;
        }
    } else {
        _t65 = _t65;
        do {
            if(_t48 == 34) {
                _t65 = _t65 == 0;
            }
            if(_t65 != 0 || _t48 != 32) {
                goto L6;
            } else {
                do {
L8:
                    __esi =  &(__esi[1]);
                } while( *__esi == 32);
            }
            goto L9;
L6:
            _t48 = (__esi[1]) & 65535;
            __esi =  &(__esi[1]);
        } while(_t48 != 0);
        goto L7;
    }
L9:
    if( *__esi != 64) {
    } else {
        _t63 = (__esi[1]) & 65535;
        __esi =  &(__esi[1]);
        _t83 = 0;
        _t73 =  &_v624;
        if(_t63 == 0) {
        } else {
            __ebx = __ebx;
L12:
L12:
            if(_t63 == 34) {
                _t83 = _t83 == 0;
            }
            if(_t83 != 0 || _t63 != 32) {
                goto L16;
            }
            goto L19;
L16:
            if(_t63 != 34) {
                 *_t73 = _t63;
                _t73 =  &(_t73[2]);
            }
            _t63 = (__esi[1]) & 65535;
            __esi =  &(__esi[1]);
            if(_t63 != 0) {
                goto L12;
            }
        }
L19:
        _t48 = 0;
         *_t73 = 0;
        if( *__esi != 32) {
        } else {
            do {
                __esi =  &(__esi[1]);
            } while( *__esi == 32);
        }
        _t65 =  &_v624;
        _push( &_v624);
        __imp__SetCurrentDirectoryW();
        if(_t48 == 0) {
            _t48 = L00401000(_t48, __ebx, _t65, _t83);
        }
    }
    _t75 =  &_v8;
    _push( &_v8);
    _push(8);
    _v8 = 0;
    _v20 = 0;
    __imp__GetCurrentProcess();
    _push(_t48);
    __imp__OpenProcessToken();
    if(_t48 == 0) {
        L00401000(_t48, __ebx, _t65, _t75);
    }
    _t76 = _v8;
    _t49 =  &_v20;
    _push(_t49);
    _push(4);
    _t66 =  &_v12;
    _push( &_v12);
    _push(20);
    _push(_v8);
    __imp__GetTokenInformation();
    if(_t49 == 0) {
        L00401000(_t49, __ebx, _t66, _t76);
    }
    _t85 = __imp__CloseHandle;
    _push(_v8);
     *_t85();
    if(_v12 != 0) {
        _push(68);
        _push(0);
        _push( &_v104);
        memset();
        _t67 =  *4202752;
        _v36 = 0;
        _v32 = 0;
        _v28 = 0;
        _v24 = 0;
        __esp = __esp + 12;
        _v104 = 68;
        _v16 =  *4202748;
        _v12 =  *4202752;
        if( *__esi == 0) {
            __esi =  &_v16;
        }
        _t78 =  &_v36;
        _push( &_v36);
        _t53 =  &_v104;
        _push(_t53);
        _push(0);
        _push(0);
        _push(0);
        _push(0);
        _push(0);
        _push(0);
        _push(__esi);
        _push(0);
        _v92 = __esi;
        __imp__CreateProcessW();
        if(_t53 == 0) {
            L00401000(_t53, __ebx, _t67, _t78);
        }
        _push(_v36);
         *_t85();
        _push(_v32);
         *_t85();
        goto L41;
    } else {
        _push(8188);
        _t55 =  &_v8812;
        _push(0);
        _push(_t55);
        _v8816 = 2228288;
        memset();
        __esp = __esp + 12;
        _push( &_v8812);
        _push(260);
        __imp__GetCurrentDirectoryW();
        _t56 = __ebp + -8808 + _t55 * 2;
         *_t56 = 2097186;
        _t70 =  *__esi & 65535;
        _t57 = _t56 + 4;
        _t80 = __esi;
        if(_t70 == 0) {
        } else {
            __ebx = __ebx;
            do {
                _t80 =  &(_t80[1]);
                 *_t57 = _t70;
                _t70 =  *_t80 & 65535;
                _t57 =  &(_t57[0]);
            } while(_t70 != 0);
        }
        _push(60);
         *_t57 = 0;
        _push(0);
        _push( &_v96);
        memset();
        __esp = __esp + 12;
        _push(260);
        _push( &_v624);
        _push(0);
        _v96 = 60;
        _v68 = 1;
        __imp__GetModuleFileNameW();
        _t72 =  &_v96;
        _t82 =  &_v624;
        _t59 =  &_v8816;
        _push( &_v96);
        _v80 =  &_v624;
        _v84 = 4202736;
        _v76 = _t59;
        __imp__ShellExecuteExW();
        if(_t59 != 0) {
L41:
            _pop(__edi);
            return;
        } else {
            __imp__GetLastError();
            if(_t59 != 1223) {
                L00401000(_t59, __ebx, _t72, _t82);
            }
            _pop(__edi);
            return;
        }
    }
}

memset()
{// addr = 0x00401796
    goto __imp__memset;
}

memset()
{// addr = 0x00401796
    goto __imp__memset;
}

// Statistics:
//      73 Register nodes
//     224 Temporaries nodes
//       0 Casts
//     161 Statements
//      40 Labels
//      18 Gotos
//       3 Blocks
//    1189 Nodes
//      16 Assembly nodes
//      20 Unknown Types


Total time: 1 seconds.
dark
Новичок
Reputation: 0
With us: 4 yaers 10 months

Post #5by dark » 02.05.2013, 10:59

VEG прошу удалить пост выше, придется писать самому.
dark
Новичок
Reputation: 0
With us: 4 yaers 10 months


Return to Мастерская