Форум: "WinAPI";
Текущий архив: 2007.01.14;
Скачать: [xml.tar.bz2];
ВнизСервис не ShutDownит сервер с выданными привилегиями. Найти похожие ветки
← →
Kacnep © (2006-08-25 07:45) [0]Ув. мастера! Сервис по приходу некой команды из сети должен выполнить *.cmd файл. Вот что например
c:\adm\ss.cmdshutdown /s /f >c:\adm\log.txt
т.е. выключить сервер, но этого не происходит.
Сам командник запускается! Файл log.txt появляется.
Привелегии необходимые вроде бы выдал - не уверен что в том месте программы.
Сервис запускается как Local System.
Может кто нить что подсказать (сервера 2000 и 2003).
Я рассматривал пример
http://delphimaster.net/view/4-1147525423/Вот куски кода...
....
procedure AdjTokenPrivelegs(mmName: string);
var
gler: DWord;
begin
AdjustPriviliges(mmName);
gler:=GetLastError;
if (gler<>ERROR_SUCCESS) then begin
WriteLog(Format("%s: [FAILED] ", [mmName]));
{$IFDEF _DEV_}
ShowError(gler);
{$ENDIF}
exit;
end;
WriteLog(Format("%s: [OK] ", [mmName]));
end;
procedure Tf_Main.ServiceStart(Sender: TService; var Started: Boolean); //эта штука при старте сервера - тут и выдаю привилегии
var
sl_Tmp:TStringList;
s:string;
i:integer;
begin
Started:=FALSE;
AdjTokenPrivelegs(SE_SHUTDOWN_NAME); //выдаем ЭТУ ТОЧНО ПРИВИЛЕГИЮ!!!
AdjTokenPrivelegs(SE_DEBUG_NAME);
WriteLog("Service is starting... ");
if not StartServer then
WriteLog("Error starting server")
else WriteLog("Server started successfully!");
WriteLog("Service is started.");
Started:=TRUE;
end;
....
procedure Tf_Main.id_SrvCommandHandlers0Command(ASender: TIdCommand); //это по приходу команды из сети использую компонент инди
var
PMSI:TStartupInfo;
PMPI:TProcessInformation;
begin
WriteLog(ASender.Context.Connection.Socket.Binding.PeerIP+" -> Shutdown");
if (FIP.Count>0) and (FIP.IndexOf(ASender.Context.Connection.Socket.Binding.PeerIP)>-1) then begin
WriteLog("Execute Shutdown! "+FScript);
FillChar(PMSI,sizeof(PMSI),0);
PMSI.cb:=sizeof(PMSI);
FillChar(PMPI,sizeof(PMPI),0);
try
try //Win32Check(
if not CreateProcess(nil,PChar(FScript),nil,nil,true,0,{false,normal_priority_class,}ni l,nil,PMSI,PMPI) then RaiseLastWin32Error;
except
WriteLog("Error: "+SysErrorMessage(GetLastError));
end;
finally
CloseHandle(PMPI.hProcess);
CloseHandle(PMPI.hThread);
end;
end;//if
end;
← →
Сергей М. © (2006-08-25 08:19) [1]
> Привелегии необходимые вроде бы выдал
Ты их кому выдал-то ? Сервису. А инициатором шатдауна кто является ? Совсем другой процесс, тот самый который у тебя скрипт исполняет. Вот как раз ему-то и нужны эти привелегии, а не сервису.
← →
Сергей М. © (2006-08-25 08:21) [2]И чем тебе Win32Check не угодил - тоже не понятно)
← →
Kacnep © (2006-08-25 08:23) [3]2 Сергей М.
Насчет Вин32Чек
Просто в доке про CreateProcess - сказано что он сам выдает код ошибки...
Не стал лишнюю ф-ю юзать. Но это ж не принципиально.
Насчет ДРУГОГО процесса - сейчас попробую...
Спасибо за советы!
← →
Сергей М. © (2006-08-25 08:55) [4]
> в доке про CreateProcess - сказано что он сам выдает код
> ошибки
Ну так ты ж все равно при этом исключение возбуждаешь (см. raiselastwin32error)..
Конечно код
try
if not CreateProcess(..) then RaiseLastWin32Error;
except
WriteLog("Error: "+SysErrorMessage(GetLastError));
end;
полностью эквивалентен этому
try
Win32Check(CreateProcess(..));
except
WriteLog("Error: "+SysErrorMessage(GetLastError));
end;
но код с Win32Check и короче в написании и изящней ..
← →
Kacnep © (2006-08-25 11:21) [5]Люди :( не смог разобраться с правами - знаний не хватает.
А сейчас и времени.
Думал что проще получиться.
Общая ситуация такая.
ВНИМАНИЕ! На сервере никто не залогинен!!! Это обязан выполнить процесс!Преред выключением сервера - на нем должен выполниться скрипт гашения скажем оракловой базы.
Если я залогинюсь на сервак то гашу так.
sqlplus {если выполняет эту команду сервис - почему то требуется прописать пути а если вручную запускаю то пути берет из переменных окружения} /nolog @{путь где лежит\}скрипт гашение базы.
Потом выключаю сервер 2003
shutdown /s /f
Все эти команды и возможно другие должен выполнять мой
CreateProcess(nil,PChar(FScript),nil,nil,true,0,nil,nil,PMSI,PMPI);
Я даже не знаю как точно вопрос задать... %(
В общем надо как то процесс запуска скрипта наделить всеми! полномочиями администратора именно этого сервера на котором он выполняется.
Помогите. Тут у меня знаний не хватает. Нашел кучу примеров как наделять процесс какой то какими то правами - но какие конкретно мне нужны - не понимаю кроме seShutDown....
← →
Сергей М. © (2006-08-25 11:38) [6]
> Нашел кучу примеров как наделять процесс какой то какими
> то правами
Показывай, как ты наделяешь стартуемый твоим сервисом процесс шатдаун-правом ..
← →
Чапаев © (2006-08-25 11:45) [7]> Все эти команды и возможно другие должен выполнять мой
> CreateProcess(nil,PChar(FScript),nil,nil,true,0,nil,nil,
> PMSI,PMPI);
Вообще кошернее выполнить cmd.exe, которому в качестве аргумента передаётся командный файл...
← →
Ketmar © (2006-08-25 11:48) [8]сильно подозреваю, что или никак, или неправильно. однозначно -- код в студию.
← →
BiN © (2006-08-25 11:48) [9]
> Kacnep © (25.08.06 11:21) [5]
Компьютер при этом залочен?
← →
Kacnep © (2006-08-25 12:05) [10]так попорядку от простого к сложному...
2 BiN © (25.08.06 11:48) [9]
Мало того! На него никто и не заходил после перезагрузки! Установили сервис запустили в авто и ребутанули! Цель чтобы сервис уже работал (и он работает) и ожидал команды!
2 Чапаев
Опять же... и СМД выполняется и пинг и прочие -простые команды "примитивные" а вот что то типа Шатдауна или... {блин кажется если я про Оракл вас загружу - уныло будет - там жопная аутентификация}
2 Остальные вот код но это только для Шатдауна!!! А мне требуется грубоговоря сделать копию списка админский прав!!!procedure Tf_Main.id_SrvCommandHandlers0Command(ASender: TIdCommand);
const
PrivelegStr="SeShutdownPrivilege";
var
PMSI:TStartupInfo;
PMPI:TProcessInformation;
hTok: THandle;
tp: TTokenPrivileges;
begin
WriteLog(ASender.Context.Connection.Socket.Binding.PeerIP+" -> Shutdown");
if (FIP.Count>0) and (FIP.IndexOf(ASender.Context.Connection.Socket.Binding.PeerIP)>-1) then begin
WriteLog("Execute Shutdown! "+FScript);
FillChar(PMSI,sizeof(PMSI),0);
PMSI.cb:=sizeof(PMSI);
FillChar(PMPI,sizeof(PMPI),0);
try
try
Win32Check(CreateProcess(nil,PChar(FScript),nil,nil,false,0,{false,normal_priori ty_class,}nil,nil,PMSI,PMPI));
if OpenProcessToken(PMPI.hProcess, TOKEN_ADJUST_PRIVILEGES+TOKEN_QUERY, hTok) then //я так понял тут начинаю работать с процессом
try
// Get the LUID for privilege.
if LookupPrivilegeValue(nil, PChar(PrivelegStr),tp.Privileges[0].Luid) then begin
tp.PrivilegeCount:=1; // one privilege to set
tp.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
// Get privilege for this process.
AdjustTokenPrivileges(hTok,False,tp,0,PTokenPrivileges(nil)^, PDWord(nil)^);
end
finally
// Cannot test the return value of AdjustTokenPrivileges.
if (GetLastError <> ERROR_SUCCESS) then raise Exception.Create("AdjustTokenPrivileges enable failed");
CloseHandle(hTok);
end
else raise Exception.Create("OpenProcessToken failed");
except
WriteLog("Error: "+SysErrorMessage(GetLastError));
end;
finally
CloseHandle(PMPI.hProcess);
CloseHandle(PMPI.hThread);
end;
end;//if
end;
← →
Ketmar © (2006-08-25 12:11) [11]> [10] Kacnep © (25.08.06 12:05)
CreateProcessAsUser()/LogonUser()?
← →
Сергей М. © (2006-08-25 12:14) [12]
> Kacnep © (25.08.06 12:05) [10]
Вот ты стартовал процесс, он УЖЕ работает, УЖЕ выполняет скрипт и вероятно УЖЕ попытался шатдаун выполнить, а ты только еще чухнулся привелегии ему дать)
Стартуй процесс с опцией CREATE_SUSPENDED, назначай ему соотв.привелегии, и уж потом только толкай его на выполнение с этими привелегиями - ResumeThread(PMPI.hThread)
← →
Kacnep © (2006-08-25 12:17) [13]Спасибо Мастера! Все советы попробую!
← →
BiN © (2006-08-25 12:19) [14]
> Kacnep © (25.08.06 12:05) [10]
>
> так попорядку от простого к сложному...
> 2 BiN © (25.08.06 11:48) [9]
> Мало того! На него никто и не заходил после перезагрузки!
> Установили сервис запустили в авто и ребутанули! Цель чтобы
> сервис уже работал (и он работает) и ожидал команды!
Ок. Просто имей ввиду http://support.microsoft.com/?id=821287
Теперь по коду.
Запусти CreateProcess с флагом CREATE_SUSPENDED, а после установки привилегии возобнови работу с пом. ResumeThread.
Мелкое замечание поfinally
// Cannot test the return value of AdjustTokenPrivileges.
if (GetLastError <> ERROR_SUCCESS) then raise Exception.Create("AdjustTokenPrivileges enable failed");
CloseHandle(hTok);
end
CloseHandle(hTok) должен стоять до возбуждения исключения.
Вот протестированная функция включения/выключения привилегий
function SetTokenPrivilege(hToken: THandle; const PrivilegeName:string;
NewState: DWORD; PreState: PDWORD=nil): Boolean;
var
LUID : TLargeInteger;
Privilege, PrevPrivilege: TTokenPrivileges;
cbPrevPriv:DWORD;
begin
Result:= False;
if LookupPrivilegeValue (nil, PChar (PrivilegeName), LUID) then
begin
Privilege.PrivilegeCount:=1;
Privilege.Privileges[0].Luid:=LUID;
Privilege.Privileges[0].Attributes:=NewState;
cbPrevPriv := SizeOf (PrevPrivilege);
Result:= AdjustTokenPrivileges(hToken, False, Privilege, cbPrevPriv, Privilege, cbPrevPriv);
if Result and Assigned(PreState)
then PreState^:=PrevPrivilege.Privileges[0].Attributes;
end;
end;
// NewState - SE_PRIVILEGE_ENABLED или 0
function SetProcessTokenPrivilege(hProcess:DWORD; const PrivilegeName:string;
NewState: DWORD; PreState: PDWORD=nil): Boolean;
var
hToken : THandle;
begin
Result:= False;
if not OpenProcessToken(hProcess,
TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,
hToken)
then Exit;
Result:=SetTokenPrivilege(hToken, PrivilegeName, NewState, PreState) and
(GetLastError()=ERROR_SUCCESS);
CloseHandle (hToken);
end;
← →
Kacnep © (2006-08-25 12:22) [15]Стоп!
А насчет Гашения базы.
В Оракле пользователькоторый может погасить "интерактивно" базу должен принадлежать группе ORA_DBA точно не помню...
Как Мной запущеный процесс поступит?
Или когда я говорю что процесс может шатдаунить машину ему выдаются привелегии АДМИНА который обладает правом ORA_DBA???
← →
Kacnep © (2006-08-28 08:22) [16]Пока не получилось вроде применял все рекомендации.
Вот ВСЕ исходники... Может кто поможет...
Прогу компилим
запускаем сначала с параметром /install - устанавливаем как сервис {убрать соответственно параметром /uninstall}
в папке с прогой должен быть инишник
В нем первый параметр - какой скрипт и откуда запускать
Второй параметр с какого ИП разрешено принимать команды.
После СТАРТА сервиса запускаем телнет на порт 9999 и просто посылаем команду shutdown.
Клиент сразу отцепиться а на серваке {2003 или ХР есть команда SHUTDOWN} должен выполниться Ваш скрипт.
Я буду еще искать решение проблемы. Но буду благодарен любому кто укажет где в программе ошибка. Спасибо.
settings.ini[Script]
File=C:\Adm\ss.cmd
[IPs]
IP1=172.31.34.152
IP2=127.0.0.1
ss.cmdshutdown -r -f
u_Main5.dfmobject f_Main: Tf_Main
OldCreateOrder = False
OnCreate = ServiceCreate
OnDestroy = ServiceDestroy
AllowPause = False
DisplayName = "Ups_Listener"
OnStart = ServiceStart
OnStop = ServiceStop
Left = 321
Top = 150
Height = 150
Width = 215
object id_Srv: TIdCmdTCPServer
Bindings = <>
DefaultPort = 9999
TerminateWaitTime = 2000
CommandHandlers = <
item
CmdDelimiter = " "
Command = "SHUTDOWN"
Disconnect = True
Name = "ch_ShutDown"
NormalReply.Code = "200"
ParamDelimiter = " "
Tag = 0
OnCommand = id_SrvCommandHandlers0Command
end>
ExceptionReply.Code = "500"
ExceptionReply.Text.Strings = (
"Unknown Internal Error")
Greeting.Code = "200"
Greeting.Text.Strings = (
"Welcome")
HelpReply.Code = "100"
HelpReply.Text.Strings = (
"Help follows")
MaxConnectionReply.Code = "300"
MaxConnectionReply.Text.Strings = (
"Too many connections. Try again later.")
ReplyTexts = <>
ReplyUnknownCommand.Code = "400"
ReplyUnknownCommand.Text.Strings = (
"Unknown Command")
Left = 28
Top = 26
end
end
← →
Kacnep © (2006-08-28 08:23) [17]u_Main5.pas
unit u_Main5;
interface
uses
Windows,
Messages,
SysUtils,
Classes,
SvcMgr,
IniFiles,
IdCmdTCPServer,IdCommandHandlers, IdBaseComponent, IdComponent, IdCustomTCPServer, IdTCPServer;
type
Tf_Main = class(TService)
id_Srv: TIdCmdTCPServer;
procedure id_SrvCommandHandlers0Command(ASender: TIdCommand);
procedure ServiceStart(Sender: TService; var Started: Boolean);
procedure ServiceStop(Sender: TService; var Stopped: Boolean);
procedure ServiceCreate(Sender: TObject);
procedure ServiceDestroy(Sender: TObject);
private
FIP:TStringList;
FScript:string;
function StartServer: Boolean;
function StopServer: Boolean;
{ Private declarations }
public
function GetServiceController: TServiceController; override;
{ Public declarations }
end;
const
c_Log="Service.log";
c_Ini="settings.ini";
var
f_Main: Tf_Main;
implementation
{$R *.DFM}
uses
ShellAPI;
var
CreateOptScan: LongWord;
Log,Ini:TFileName;
hLog: THandle;
function WriteLog(Status: string): DWord; forward;
procedure ServiceController(CtrlCode: DWord); stdcall;
begin
f_Main.Controller(CtrlCode);
end;
function Tf_Main.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;
function SetTokenPrivilege(hToken: THandle; const PrivilegeName:string; NewState: DWORD; PreState: PDWORD=nil): Boolean;
var
LUID : TLargeInteger;
Privilege, PrevPrivilege: TTokenPrivileges;
cbPrevPriv:DWORD;
begin
Result:= False;
if LookupPrivilegeValue (nil,PChar(PrivilegeName),LUID) then begin
Privilege.PrivilegeCount:=1;
Privilege.Privileges[0].Luid:=LUID;
Privilege.Privileges[0].Attributes:=NewState;
cbPrevPriv:=SizeOf(PrevPrivilege);
Result:=AdjustTokenPrivileges(hToken, False, Privilege, cbPrevPriv, Privilege, cbPrevPriv);
if (Result and Assigned(PreState)) then PreState^:=PrevPrivilege.Privileges[0].Attributes;
end;
end;
function SetProcessTokenPrivilege(hProcess:DWORD; const PrivilegeName:string;NewState: DWORD; PreState: PDWORD=nil): Boolean;
var
hToken : THandle;
begin
Result:= False;
if not OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,hToken) then begin
WriteLog("OpenProcessToken [Fail]");
Exit;
end;
Result:=SetTokenPrivilege(hToken, PrivilegeName, NewState, PreState) and (GetLastError=ERROR_SUCCESS);
CloseHandle (hToken);
end;
procedure Tf_Main.id_SrvCommandHandlers0Command(ASender: TIdCommand);
const
PrivelegStr="SeShutdownPrivilege";
var
PMSI:TStartupInfo;
PMPI:TProcessInformation;
env:array[0..100] of char;
begin
WriteLog(ASender.Context.Connection.Socket.Binding.PeerIP+" -> Shutdown");
if (FIP.Count>0) and (FIP.IndexOf(ASender.Context.Connection.Socket.Binding.PeerIP)>-1) then begin
WriteLog("Execute Shutdown! "+FScript);
ZeroMemory(@env,sizeof(env));
ZeroMemory(@PMSI,sizeof(PMSI));
ZeroMemory(@PMPI,sizeof(PMPI));
PMSI.cb:=sizeof(PMSI);
try
try
Win32Check(CreateProcess(nil,PChar(FScript),nil,nil,true,CREATE_SUSPENDED,@env,P Char("C:\"),PMSI,PMPI));
WriteLog("Create suspend process [OK]");
SetProcessTokenPrivilege(PMPI.hProcess,PChar(PrivelegStr),SE_PRIVILEGE_ENABLED);
WriteLog("SetProcessTokenPrivilege: "+SysErrorMessage(GetLastError));
if GetLastError=ERROR_SUCCESS then begin
ResumeThread(PMPI.hThread);
WriteLog("ResumeThread: "+SysErrorMessage(GetLastError));
end;
except
WriteLog("Error: "+SysErrorMessage(GetLastError));
end;
finally
CloseHandle(PMPI.hProcess);
CloseHandle(PMPI.hThread);
end;
end;//if
end;
function Tf_Main.StopServer: Boolean;
begin
id_Srv.Active:=false;
Result:=not id_Srv.Active;
if result then WriteLog("Server stoped [OK]")
else WriteLog("Server stoped [Fail]");
end;
function Tf_Main.StartServer: Boolean;
begin
id_Srv.DefaultPort:=9999;
try
WriteLog("Server starting...");
id_Srv.Active:=true;
result:=id_Srv.Active;
except
on E : Exception do begin
WriteLog("Server start [Fail]");
WriteLog(E.Message);
Result:=false;
end;
end;
end;
procedure Tf_Main.ServiceStart(Sender: TService; var Started: Boolean);
var
sl_Tmp:TStringList;
s:string;
i:integer;
begin
Started:=FALSE;
Ini:=ExtractFilePath(paramstr(0))+c_Ini;
Log:=ExtractFilePath(paramstr(0))+c_Log;
WriteLog("Service is starting... ");
FIP:=TStringList.Create;
sl_Tmp:=TStringList.Create;
try
with TIniFile.Create(Ini) do begin
FScript:=ReadString("Script","File","");
ReadSection("IPs",sl_Tmp);
for i:=0 to sl_Tmp.Count-1 do begin
s:=trim(ReadString("IPs",sl_Tmp.Strings[i],""));
if s<>"" then FIP.Add(s);
end;
Free;
end;// WIth
finally
FreeAndNil(sl_Tmp);
end;
if not StartServer then begin
WriteLog("Server start [Fail]");
Started:=False;
end
else begin
WriteLog("Server started [OK]");
WriteLog("Service started [OK]");
Started:=TRUE;
end;
end;
procedure Tf_Main.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
WriteLog("Service is stoping... ");
if not StopServer then WriteLog("Server stop [Fail]");
FreeAndNil(FIP);
WriteLog("Service stoped [OK]");
Stopped:=TRUE;
end;
procedure Tf_Main.ServiceCreate(Sender: TObject);
begin
if sysutils.Win32Platform=VER_PLATFORM_WIN32_NT then CreateOptScan:=FILE_FLAG_SEQUENTIAL_SCAN
else CreateOptScan:=0;
end;
function WriteLog(Status: string): DWord;
var
xBuf: array[0..$FF - 1] of Char;
begin
if (hLog = INVALID_HANDLE_VALUE) or (hLog = 0) then begin
if FileExists(Log) then
hLog := CreateFile(PChar(Log),
GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ,
nil,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL or CreateOptScan,
0)
else
hLog := CreateFile(PChar(Log),
GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ,
nil,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL or CreateOptScan,
0);
if hLog = INVALID_HANDLE_VALUE then begin
Result := DWord(-1);
exit;
end;
FileSeek(hLog, 0, 2);
end;
FillChar(xBuf, $FF, 0);
Status := Format("[%s] %s"#13#10, [DateTimeTostr(Now), Status]);
move((Pointer(@Status[1]))^, xBuf, Length(Status));
FileWrite(hLog, xBuf, Length(Status));
FlushFileBuffers(hLog);
Result := 0;
end;
procedure Tf_Main.ServiceDestroy(Sender: TObject);
begin
WriteLog("Service uninstall [OK]");
CloseHandle(hLog);
end;
end.
← →
Ketmar © (2006-08-28 10:10) [18]* Кэтмар у утреннем настроении *
нет, я, конечно, всё понимаю, но ему за это, небось, денег платят, а мы тут так, забесплатно должны кучу кода читать...
← →
Kacnep © (2006-08-28 10:57) [19]:) Утром добрым... :)
Нет народ - это для облегчения моего гемороя :).
Если я доделаю этот сервис - то его скопировать и запустить на все серваки а их ооочень много :) не составит большого труда. А ЕСЛИ НЕТ... Придется официальный софт от производителся ставить и настраивать на каждой машине... ЭЭтого я вынести не смогу! :(((
А код - просто вставляеться в соответствующие файлы и компилиться -получаем готовый проект. Который уже можно просматривать. Вернее кажеться собака зарыта только в ф-ии создания процесса. Так сказать "код в студию".
Сейчас лазию по инету ищу примеры написания РАБОТАЮЩИХ сервисов.
Но все же основная надежда на Мастеров...
← →
BiN © (2006-08-28 11:12) [20]
> Kacnep © (28.08.06 10:57) [19]
А можно узнать, что требуется еще от сообщества? Код что ли с нуля написать?
PS
GetLastError имеет смысл проверять только при неудачном выполнении функции (это я про вызов SetProcessTokenPrivilege)
PPS
"Простой" процесс, который только и делает, что пишет о себе в лог, создавать пробовал?
← →
Kacnep © (2006-08-28 11:19) [21]ДА! Все работает! И мало того скажем если я в файле ss.cmd (запускаемый сервисом скрипт) например пишу ping 127.0.0.1 >c:\adm\log.txt -в логе нормано вижу что команда пинг отработала. Сервис работает!!! Но когда на тачке никто не залогинен команда shutdown -r не работает! :((. Уже бесит этот кусок. :(
За замечания спасибо. Просто еще в коде много лишней отладочной инфы которая пишется в лог только для проверки.
Вот что например сейчас в ЛОГе[28.08.2006 12:09:38] Service is stoping...
[28.08.2006 12:09:38] Server stoped [OK]
[28.08.2006 12:09:38] Service stoped [OK]
[28.08.2006 12:09:38] Service uninstall [OK]
[28.08.2006 12:09:53] Service is starting...
[28.08.2006 12:09:53] Server starting...
[28.08.2006 12:09:53] Server started [OK]
[28.08.2006 12:09:53] Service started [OK]
[28.08.2006 12:10:22] 172.31.39.233 -> Shutdown
[28.08.2006 12:10:22] Execute Shutdown! C:\ADM\ss.cmd
[28.08.2006 12:10:22] Create suspend process [OK]
[28.08.2006 12:10:22] SetProcessTokenPrivilege: The operation completed successfully
[28.08.2006 12:10:22] ResumeThread: The operation completed successfully
← →
BiN © (2006-08-28 11:41) [22]А без вызова shutdown.exe обойтись не хочешь? Например вызвать ExitWindowsEx или InitiateSystemShutdown(Ex)
← →
Kacnep © (2006-08-28 11:54) [23]:((
к сожалению не хочу...
Мне ВАЖНО чтоб ЛЮБАЯ программа прописаная в файле "скрипта" нормально выполнялась. И ВОЗМОЖНО! потом шатдаун! Я например на критичных серваках просто остановлю и корректно завершу работу баз. Бэкапов и прочее. Это все я в скрипте пропишу! Вот для чего он нужен. А потом могу и шатдаунить спокойно. НО ЭТОТ ПРОЦЕСС!! будь он неладен :( не хочет ДАЖЕ шатдаун выполнить по всем рекомендациям Мастеров и хелпам инета. :(.
Сейчас работает примитивно - в скрипте запускает тупо утилитку psshutdown - она пробивает любую операционку (на 2000 shutdownа нет :( ).
Но я хочу добить - понять почему то, что по всем понятиям ДОЛЖНО работать - не работает :((.
Куча рассматриваемых вопросов в инете как зашатдаунить тачку в НТ. ВСЕ! копия моего (вернее наоборот) у них только после запуска процесса стоит дельфийская команда шатдауна :(. И видимо все работает - почему мой скрипт выполняющий стандартную команду шатдауна НА НЕЗАЛОГИНЕНОМ сервере не выполняется :(.
← →
Ketmar © (2006-08-28 11:58) [24]цитата:
The LogonUser function attempts to perform a user logon operation. You specify the user with a user name and domain, and authenticate the user with a clear-text password. If the function succeeds, you receive a handle to a token that represents the logged-on user. You can then use this token handle to impersonate the specified user, or in most cases, to create a process running in the context of the specified user.
логинься себе под админом и запускай под ним всё, что угодно.
← →
BiN © (2006-08-28 12:02) [25]
> Kacnep © (28.08.06 11:54) [23]
Попробуй запустить скрипт шедулером. Если не вызывается, то проблема в скрипте или в ошибке системы. В этом случае нужно копать мс-овский технет.
Кстати, думаю, shutdown самостоятельно включает нужные привилегии.
← →
Ketmar © (2006-08-28 12:05) [26]> [25] BiN © (28.08.06 12:02)
ну не мешай, а? я тут так подло толкаю в сторону дебрей логина, а ты весь кайф ломаешь... %-)
← →
BiN © (2006-08-28 12:18) [27]
> Ketmar © (28.08.06 12:05) [26]
Сусанин, блин.
-)
← →
Kacnep © (2006-08-28 12:38) [28]2 Ketmar
На всех серверах разные пароли и вшивать в прогу и каждый раз перекомпилить - не выход :(( В отдельном файле держать в незашифрованом виде нельзя :(.
Т.е. ЛОГОН кажеться никак применить тут нельзя... :(
2 BiN
Фантастика
Если я залогинен на сервер
то такой скрипт выполняеться@echo time /t >c:\adm\start.log
ping 172.31.32.100 >c:\adm\ping.log
@echo time /t >c:\adm\stop.log
shutdown /r /f >c:\adm\s.log
Если незалогинен то шедулер запускает скрипт но ТОЛЬКО НЕ ШАТДАУН!!!
Все остальное отрабатывает...:(((
← →
BiN © (2006-08-28 12:44) [29]
> Если незалогинен то шедулер запускает скрипт но ТОЛЬКО НЕ
> ШАТДАУН!!!
> Все остальное отрабатывает...:(((
Ты по ссылке в BiN © (25.08.06 12:19) [14] ходил?
← →
umbra © (2006-08-28 20:10) [30]
>
> Если незалогинен то шедулер запускает скрипт но ТОЛЬКО НЕ
> ШАТДАУН!!!
>
Это настройка безопасности. Запустите из командной строкиgpedit.msc
и сделайтеEnabled
опциюLocal computer policy\Computer Configuration\Security Settings\Local Policies\Security Options\Shutdown: Allow the system to be shut down without having to log on
(Вин2003Сервер). По умолчанию запрещено гасить компьютер, если нет интерактивных сессий.
← →
Kacnep © (2006-08-29 10:54) [31]Установлена :((
НИКАКОЙ щатдаун если незалогинен не работает! :(
НИКАК!
Кажеться BiN © (28.08.06 12:44) [29] прав.
На 2003 надо ставить какой то ХОТФИКС а на 2000?
Но главное выяснил - в процедуре выдачи прав - все верно. Значит приджется искать шатдаунитель нормальный %((.
← →
Kacnep © (2006-09-01 10:15) [32]Проблема до сих пор не снята. :(
Например выполняю команду в скрипте c:\windows\system32\shutdown.exe /? >c:\log.txt
Делаю логофф.
По шедулеру отрабатывает нормально. В лог.тхт хелп есть.
С помощью сервиса - длина файла лог.тхт =0 :( т.е. инфы в нем никакой нет.
Вывод - почему то не работает корректно процедура создания процесса :(
Полностью код всего проекта выложен выше.
Может кто нить сможет помочь? :(
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2007.01.14;
Скачать: [xml.tar.bz2];
Память: 0.59 MB
Время: 0.013 c